今天主要说三个内容,都是和ASP.NET有关的内容。

  • 第一个关于自定义错误的,就是在网站出现404或者500的错误,如何给用户显示一个友好的界面。
  • 第二个是分离配置文件web.config,如果配置信息很多,都放在web.cofig文件,文件会越来越大,越来越长。信息太多了,不便于浏览和维护,如果能分成独立的config该多好。
  • 第三个是关于多环境发布的,多环境指的是:开发环境,测试环境,生产测试环境,生产环境。利用VS方便多环境的配置文件修改。

 

1.自定义错误

这里说的错误,多指http的错误,例如,404找不到访问的资源,403未授权,500服务器错误。

 

1.1用代码引导用户

 

 

 
  1. Response.Write("<h1>400</h1>"); 
  2.  
  3. Response.Redirect("404.html"); 

 

两种方式:

  • 一种是直接给用户呈现信息,使用response.write来完成。
  • 一种是引导用户跳转到一个做好的页面。

 

 

1.2使用配置文件

 

1.2.1 customerrors

 

在web.cofig文件中提供了一个关于自定义错误的配置节,通过配置,就可以实现错误自动跳转。

 

 
  1. <system.web> 
  2.  
  3.   <customErrors defaultRedirect="/views/shared/error.aspx" mode="Off"> 
  4.  
  5.     <error statusCode="404" redirect="/views/shared/404.aspx" /> 
  6.  
  7.   </customErrors> 
  8.  
  9. </system.web> 

 

上面的配置中说明,如果出现404就跳转到/views/shared/404.aspx页面,其他的就跳转到/views/shared/error.aspx页面。

mode有三个值可选。

  • Off,关闭自定义错误,直接显示错误信息。在开发环境可以使用这个选项,便于差错。
  • On,使用自定义错误,不管是本地访问,还是远程访问。在生产环境建议使用这个选项,因为用户看到错误信息是不友好的,而且由于错误信息中可能包好trace stack,这些信息会暴漏系统内部的一些信息,可能会带来麻烦。
  • RemoteOnly,远程访问使用自定义错误,本地访问显示详细信息。

 

1.2.2 throw new HttpException(404, "Not Found");

 

还有一些场景,如果我们的一些业务也想使用自定义错误的配置信息,显示相应的错误页面,那就需要在代码中抛出相应的异常HttpException。

 

 

 
  1. if(true
  2.  
  3.  
  4.   throw new HttpException(404, "Not Found"); 
  5.  

 

 

有一些人提出设置Response.StatusCode=404。

在iis6中设置statuscode不起作用,不会跳转,因为虽然code被修改为404,但是没有对输出内容作修改,还不是正真的http异常,所以没有自定跳转。但是可以

throw new HttpException(404, "Not Found")

这样就可以使用自定义错误了。

 

在iis7的集成模式中,设置statuscode=404,可以实现自动跳转。

 

当然了,在业务中使用httpcode,可能不太合适,加强了应用和httpcode的耦合,而且看起来也不是很舒服。针对业务的错误提示,还是单独设计,单独实现的比较好。

关于customErrors的详细信息,可以看下面的两篇文章。

 

2.分离配置文件

分离之后有一点需要注意,就是修改分离的配置文件,iis不会重新加载分离配置文件中的信息,只有修改web.config文件,才会重新加载所有配置文件(包括分离的配置文件)的信息。

 

 

 
  1. <appSettings configSource="appSettings.config"></appSettings> 

 

 

 
  1. <appSettings file="appSettings.config"></appSettings> 

 

appSettings.config

 

 
  1. <?xml version="1.0" encoding="utf-8" ?> 
  2.  
  3. <appSettings> 
  4.  
  5.   <add key="title" value="debug "/> 
  6.  
  7. </appSettings> 

 

 

 

上面额两种都可以实现分离配置文件,将appSettings中的配置独立出来。有file属性的节点比较少,但是很多节点都有configSource属性。

 

 

3.发布环境配置文件

项目一般都会有三个环境:开发,测试,生产。

随着项目越做越大,越来越复杂,可能还会有更多的环境,例如预发布环境,自动化测试环境,手动测试环境,生产环境1,生产环境2。

总之,就是环境多了。

每个环境的配置信息不同,例如:数据库连接不同,和数据相关的配置不同,还有一些环境特定的自定义配置。

但是有一些是相同的。

如果我们只是简单的copy很多份配置文件,做起来就很累。比如说有一个配置需要修改,但是这个配置在每个环境是相同的,那么重复工作就很多。

 

其实VS工具给我们提供了一个方便的多环境配置管理,我们只要按照配置使用就可以了。

实用vs建立web application项目之后,在web.config文件下面,会同时存在web.debug.config,web.release.config,这就是默认提供的调试和发布两种环境配置。

我们还可以创建更多,在工具栏中有一个配置管理器,就是有一个下拉框,可以拉出来debug和release的那个地方,下拉项中还有一个配置管理器,打开之后,在左侧的下拉框中可以选择新建,就可以新建一种配置了。

之后就会发现下拉框中多了一个刚才新建的配置项,但是还没有多个配置文件。配置文件需要手动添加,在web.config文件上点击右键,在菜单中选择【添加配置转换】,就会多一个文件,假设刚才新建的配置叫Testing,这个文件就是web.Testing.config。

 

在web.Testing.config文件中已经有两个例子,可以让你快速的上手。

 

设置属性。

 

 
  1. <!-- 
  2.  
  3.     在下例中,“SetAttributes”转换将更改  
  4.  
  5.     “connectionString”的值,以仅在“Match”定位器  
  6.  
  7.     找到值为“MyDB”的特性“name”时使用“ReleaseSQLServer”。 
  8.  
  9.      
  10.  
  11.     <connectionStrings> 
  12.  
  13.       <add name="MyDB"  
  14.  
  15.         connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"  
  16.  
  17.         xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> 
  18.  
  19.     </connectionStrings> 
  20.  
  21.   --> 

 

 

移除属性。

 

 
  1. <compilation xdt:Transform="RemoveAttributes(debug)" /> 

 

替换节点。

   

 
  1. <!-- 
  2.  
  3.        
  4.  
  5.       在下例中,“Replace”转换将替换  
  6.  
  7.       web.config 文件的整个 <customErrors> 节。 
  8.  
  9.       请注意,由于  
  10.  
  11.       在 <system.web> 节点下仅有一个 customErrors 节,因此不需要使用“xdt:Locator”特性。 
  12.  
  13.        
  14.  
  15.       <customErrors defaultRedirect="GenericError.htm" 
  16.  
  17.         mode="RemoteOnly" xdt:Transform="Replace"> 
  18.  
  19.         <error statusCode="500" redirect="InternalError.htm"/> 
  20.  
  21.       </customErrors> 
  22.  
  23.     --> 

 

 

关于更详细的的使用,可以参考下面的两篇文章。

 

 

 

项目源码

git://github.com/woaigithub/asp.net-customerrors-seperate-config-multiple-web.config.git