Web.Config详解

       Web.Config是ASP.NET项目中一个很重要的文件,还记得当年大学时做毕业设计,答辩时一个老师的问题就是Web.Config有什么作用?当时回答的是里面可以存储数据库连接信息,老师追问,还可以做什么?我。。。无言以对。

       近来整理知识点,准备好好的把基础夯实一下,技术无论繁简,务求一步一个脚印,做到真正的领会及掌握。所以特地上网搜集了一些资料,对其中一些知识点都敲代码验证一遍,记录下来以备不时翻阅温习。

  • Web.Config读取及访问机制

      .NET程序访问配置文件中某个节点时,首先尝试在当前目录下的Web.Config中查找相应节点,如文件或节点不存在则沿着上级目录直至根目录进行查找。如果一直到根目录都没有寻找到相应的节点,则在%windir%\Microsoft.NET\Framework\vx.0\CONFIG\web.config文件中查找。如果依然没有找到,则在%windir%\Microsoft.NET\Framework\vx.0\CONFIG\machine.config文件中查找。如果依然没有找到,则返回null。

       ASP.NET网站IIS启动时会加载配置文件中的配置信息并缓存起来,这样就不必每次都重新读取配置信息。在运行过程中应用程序会监测配置文件的变化情况,一旦配置信息被修改,就重新读取并进行缓存。

  • 各配置节详解

       应用VS2013新建了一个Web应用程序项目,打开Web.Config可以看到基本结构如下图:

1. ConfigSections

 ConfigSections的作用主要是配置自定义的节点,如文件上传应用、工厂方法应用等。

       代码示例:   

 1 <configSections>
 2     <sectionGroup name="section group name">
 3         <section name="section name" type="configuration section handler class" />
 4     </sectionGroup>
 5 </configSections>
 6 
 7 <section group name>
 8     <section name>
 9         <add key="key1" value="value1" />
10     </section name>
11 </section group name>
View Code

      定义了节点之后可以通过实现IConfigurationSectionHandler接口返回一个对象,然后调用System.Configuration.ConfigurationManager.GetSection()方法返回节点信息,具体实现方式网上有实例,限于篇幅问题,在后续博客中再补充进来。

2. connectionStrings

connectionStrings的作用主要是保存数据库连接串信息。

代码示例:

1 <connectionStrings>
2     <add name="DefaultConnection" connectionString="Data Source=192.168.1.1;Initial Catalog=testDb;User ID=sa;Password=sa" providerName="System.Data.SqlClient" />
3   </connectionStrings>
View Code

      代码里获取连接串:

1 ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
View Code

      3. compilation

      代码示例:  

1 <compilation debug="true" targetFramework="4.5" defaultLanguage="c#" batch="true" />
View Code

      debug = "true" 代表启用调试,将调试符号插入已编译的页面中,会影响性能,所以应该只在开发环境中启用。

      defaultLanguage = "c#" 设置默认语言

      batch = "true" 是否支持批处理

      4. authentication

       代码示例:

1 <authentication mode="None" />
View Code

      设置ASP.NET身份验证方式,有三种验证方式:

      (1)Windows

       直接通过IIS提供身份验证。

      (2)Forms

       使用应用程序特定的逻辑进行验证

      (3)Passport

       由Microsoft提供的集中身份验证服务进行验证

       ASP.NET身份验证是一个相对比较复杂的知识点,后续会单独写一篇博文进行总结。

       5. AppSettings

       AppSettings一般用于存储项目中的一些公用配置信息。

       示例代码:

1   <appSettings>
2     <add key="IP" value="192.168.0.1"/>
3   </appSettings>
View Code

      该节点位置在Configuration根目录下。

      程序中调用的方式示例代码:

1 ConfigurationManager.AppSettings["IP"].ToString();
View Code

      6. CustomErrors

      用于处理自定义错误信息,位于<System.Web>配置节下。

      示例代码如下:   

1 <customErrors mode="RemoteOnly" defaultRedirect="error.html"></customErrors>
View Code

      mode = "On" 本地用户及远程用户都会看到自定义错误信息。

      mode = "Off" 禁用自定义错误信息,本地及远程用户都将看到详细错误信息。

      mode = "RemoteOnly" 本地用户将看到详细错误信息,远程用户将看到自定义错误信息。

      DefaultRedirect = "error.html" 发生错误时重定向的url。

      也可以根据http状态码具体指定错误页(前提是mode设置为on)

      示例代码如下:   

1 <customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
2     <error statusCode="403" redirect="403.htm" />
3     <error statusCode="404" redirect="404.htm" />
4 </customErrors>
View Code

      7. Httphandlers

      根据用户请求的url及Http谓词将用户的请求交给相应的处理程序。

      示例代码如下:

1 <httpHandlers>
2       <add path="Common/*.txt" verb="*" type="System.Web.HttpForbiddenHandler"/>
3 </httpHandlers>
View Code

      配置限定应用System.Web.HttpForbiddenHandler处理Common下的txt类型文件,即禁止访问相应文件。

      实际使用过程中,先把这个配置节放置在<system.web>下了,结果本地浏览运行报错。。

     

      对于错误原因只是大体有个感觉是服务器处理机制是IIS还是本地WebServer的不同导致的,还未知道所以然,这个后续博客深入研究。但错误提示上解决方法已经标识的很清楚了——“将配置迁移到 system.webServer/handlers 节”,于是修改代码如下:

1 <system.webServer>
2     <modules>
3       <remove name="FormsAuthenticationModule" />
4     </modules>
5     <handlers>
6       <add name="handlerName" path="Common/*.txt" verb="*" type="System.Web.HttpForbiddenHandler"/>
7     </handlers>
8 </system.webServer>
View Code

      其中handler部分为新增的,新增一个页面,页面上放置超链接访问Common下txt文件,页面如预期跳转到了友好错误处理页面。

      8. httpRuntime

      用于对Asp.NET Http运行库进行设置

      示例代码如下:

1 <httpRuntime targetFramework="4.5" executionTimeout="60" maxRequestLength="40960" appRequestQueueLimit="100" />
View Code

      设置目标Framework版本为4.5,同时最大超时时间为60s,最大并发请求为100个,最大上传文件为40M。

      9. Pages

      用于表示对特定页设置。

      示例代码如下:

1 <pages buffer="true" enableViewStateMac="true" validateRequest="true">
2       <namespaces>
3         <add namespace="System.Web.Optimization" />
4         <add namespace="Microsoft.AspNet.Identity" />
5       </namespaces>
6       <controls>
7         <add assembly="Microsoft.AspNet.Web.Optimization.WebForms" namespace="Microsoft.AspNet.Web.Optimization.WebForms" tagPrefix="webopt" />
8       </controls>
9 </pages>
View Code

      属性

      buffer: 是否启用了http响应缓冲。

      enableViewStateMac: 是否对页面的视图状态进行计算机身份验证检查,以防止用户篡改。

      validateRequest: 是否验证用户输入中包含跨站点脚本攻击或Sql注入攻击漏洞。

      子元素

      Controls: 定义标记前缀所在的 register 指令和命名空间的集合。

      namespaces: 定义一个将在程序集预编译期间使用的导入指令的集合。

      10. SessionState

      用于配置当前应用程序的会话状态

      示例代码如下:

1 <sessionState cookieless="false" timeout="30" mode="InProc" customProvider="DefaultSessionProvider">
2       <providers>
3         <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
4       </providers>
5 </sessionState>
View Code

      上述配置设置在应用程序中启用cookie,在进程中保存会话状态,指定会话超时为30分钟。

      其中mode值包括以下几个选项:

      Custom:使用自定义数据存储会话状态数据。

      InProc:默认值,由ASP.NET辅助进程来存储会话状态数据,存取速度快,但比较耗内存,不适合存储大型用户会话数据。

      Off:禁用会话状态。

      Sql Server:使用进程外Sql数据库保存会话状态数据。

      StateServer:使用进程外Asp.NET状态服务存储会话状态数据。

      11. globalization

      配置应用程序的全球化设置。

      示例代码如下:  

1 <globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8"/>
View Code

      fileEncoding:设置aspx、asmx、asax文件的存储编码。

      requestEncoding:设置客户端请求的编码。

      responseEncoding:设置服务端响应的编码。

      总结:小小的一个web.config还真是包罗万象,这还只是其中一部分配置节,其它的配置节后续再陆续补充进来,同时针对每一个配置节又有许多需要学习的点,路漫漫其修远兮,努力吧!

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。