今天主要说三个内容,都是和ASP.NET有关的内容。
- 第一个关于自定义错误的,就是在网站出现404或者500的错误,如何给用户显示一个友好的界面。
- 第二个是分离配置文件web.config,如果配置信息很多,都放在web.cofig文件,文件会越来越大,越来越长。信息太多了,不便于浏览和维护,如果能分成独立的config该多好。
- 第三个是关于多环境发布的,多环境指的是:开发环境,测试环境,生产测试环境,生产环境。利用VS方便多环境的配置文件修改。
1.自定义错误
这里说的错误,多指http的错误,例如,404找不到访问的资源,403未授权,500服务器错误。
1.1用代码引导用户
- Response.Write("<h1>400</h1>");
- Response.Redirect("404.html");
两种方式:
- 一种是直接给用户呈现信息,使用response.write来完成。
- 一种是引导用户跳转到一个做好的页面。
1.2使用配置文件
1.2.1 customerrors
在web.cofig文件中提供了一个关于自定义错误的配置节,通过配置,就可以实现错误自动跳转。
- <system.web>
- <customErrors defaultRedirect="/views/shared/error.aspx" mode="Off">
- <error statusCode="404" redirect="/views/shared/404.aspx" />
- </customErrors>
- </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。
- if(true)
- {
- throw new HttpException(404, "Not Found");
- }
有一些人提出设置Response.StatusCode=404。
在iis6中设置statuscode不起作用,不会跳转,因为虽然code被修改为404,但是没有对输出内容作修改,还不是正真的http异常,所以没有自定跳转。但是可以
throw new HttpException(404, "Not Found")
这样就可以使用自定义错误了。
在iis7的集成模式中,设置statuscode=404,可以实现自动跳转。
当然了,在业务中使用httpcode,可能不太合适,加强了应用和httpcode的耦合,而且看起来也不是很舒服。针对业务的错误提示,还是单独设计,单独实现的比较好。
关于customErrors的详细信息,可以看下面的两篇文章。
2.分离配置文件
分离之后有一点需要注意,就是修改分离的配置文件,iis不会重新加载分离配置文件中的信息,只有修改web.config文件,才会重新加载所有配置文件(包括分离的配置文件)的信息。
- <appSettings configSource="appSettings.config"></appSettings>
- <appSettings file="appSettings.config"></appSettings>
appSettings.config
- <?xml version="1.0" encoding="utf-8" ?>
- <appSettings>
- <add key="title" value="debug "/>
- </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文件中已经有两个例子,可以让你快速的上手。
设置属性。
- <!--
- 在下例中,“SetAttributes”转换将更改
- “connectionString”的值,以仅在“Match”定位器
- 找到值为“MyDB”的特性“name”时使用“ReleaseSQLServer”。
- <connectionStrings>
- <add name="MyDB"
- connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
- xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
- </connectionStrings>
- -->
移除属性。
- <compilation xdt:Transform="RemoveAttributes(debug)" />
替换节点。
- <!--
- 在下例中,“Replace”转换将替换
- web.config 文件的整个 <customErrors> 节。
- 请注意,由于
- 在 <system.web> 节点下仅有一个 customErrors 节,因此不需要使用“xdt:Locator”特性。
- <customErrors defaultRedirect="GenericError.htm"
- mode="RemoteOnly" xdt:Transform="Replace">
- <error statusCode="500" redirect="InternalError.htm"/>
- </customErrors>
- -->
关于更详细的的使用,可以参考下面的两篇文章。
项目源码
git://github.com/woaigithub/asp.net-customerrors-seperate-config-multiple-web.config.git