ASP.NET/web.config

維基教科書,自由的教學讀本

web.config是一個XML文本文件。用來存儲ASP.NET WEB的配置信息。修改後,會自動重新加載程序,並放棄原進程的會話狀態和程序狀態。

當創建一個ASP.NET項目時,默認情況下會在根目錄自動創建一個默認的web.config文件,包括默認的配置設置,所有的子目錄都繼承它的配置設置。如果想修改子目錄的配置設置,可以在該子目錄下新建一個web.config文件。它可以提供除從父目錄繼承的配置信息以外的配置信息,也可以重寫或修改父目錄中定義的設置。

配置節的聲明[編輯]

配置節處理程序聲明出現在配置文件頂部 <configSections> 和 </configSections> 標記之間,配置節聲明使用<section>節。配置節也支持嵌套,外層的配置節使用<sectionGroup>,內層的使用<section>。所有的配置節都必須遵守先聲明後使用的原則,不然編譯程序時會報錯。web.config中默認生成的配置節沒看到聲明就直接用,因為這些節的聲明是在Windows\Microsoft .NET\Framework\versionNumber\CONFIG\Machine.config中完成的。

<section name="section_name"
         type="configuration_section_handler_class, assembly_name_wo_dll_ext" />

文件內容[編輯]

web.config作為XML,根結點是<configuration>。在<configuration>節點下的常見子節點有:

  • <configSections>
  • <appSettings>:用於配置一些網站的應用配置信息。節點中的value可以按照key來進行訪問
  • <connectionStrings>:用於配置網站的數據庫連接字符串信息
  • <system.web>:網站運行時的一些配置
    • <compilation>節點控制頁面編譯和程序集引用。默認的debug屬性為「true」,即允許調試,在這種情況下會影響網站的性能,所以在程序編譯完成交付使用之後應將其設為「false」。
    • <authentication>節點控制用戶對網站、目錄或者單獨頁的訪問。屬於應用程式級別的元素,不能配置於子目錄下的 web.config。設置asp.net身份驗證模式,有四種身份驗證模式:
      • Windows 使用Windows身份驗證,適用於域用戶或者局域網用戶。
      • Forms 使用表單驗證,當沒有登陸的用戶訪問需要身份驗證的網頁,網頁自動跳轉到登陸網頁。Name屬性: 指定完成身份驗證的Http cookie的名稱。LoginUrl屬性: 如果未通過驗證或超時後重定向的頁面URL,一般為登錄頁面,讓用戶重新登錄。Protection屬性: 指定 cookie數據的保護方式,可設置為四種保護方式,All表示加密數據,並進行有效性驗證兩種方式,None表示不保護Cookie,Encryption表示對Cookie內容進行加密,validation表示對Cookie內容進行有效性驗證。TimeOut: 指定Cookie的失效時間. 超時後要重新登錄.
      • Passport 採用Passport cookie驗證模式
      • None 不進行任何身份驗證。
    • <authorization> 控制對 URL 資源的客戶端訪問(如允許匿名用戶訪問)。此元素可以在任何級別(計算機、站點、應用程式、子目錄或頁)上聲明。必需與<authentication> 節配合使用。例如,子節點<deny users="?"/>禁止匿名用戶的訪問。可以使用user.identity.name來獲取已經過驗證的當前的用戶名;可以使用web.Security.FormsAuthentication.RedirectFromLoginPage方法將已驗證的用戶重定向到用戶剛才請求的頁面。
    • <customErrors>節點用於定義一些自定義錯誤信息的信息。此節點有Mode和defaultRedirect兩個屬性,其中defaultRedirect屬性是一個可選屬性,表示應用程式發生錯誤時重定向到的默認URL,如果沒有指定該屬性則顯示一般性錯誤。Mode屬性是一個必選屬性,它有三個可能值,它們所代表的意義分別如下。訪問asp.net應用程時所使用的機器和發佈asp.net應用程式所使用的機器為同一台機器時成為本地用戶,反之則稱之為遠程用戶。在開發調試階段為了便於查找錯誤Mode屬性建議設置為Off,而在部署階段應將Mode屬性設置為On或者RemoteOnly,以避免這些詳細的錯誤信息暴露了程序代碼細節從而引來黑客的入侵。
      • On 表示在本地和遠程用戶都會看到自定義錯誤信息。
      • Off 禁用自定義錯誤信息,本地和遠程用戶都會看到詳細的錯誤信息。
      • RemoteOnly 表示本地用戶將看到詳細錯誤信息,而遠程用戶將會看到自定義錯誤信息。
      • <error>子節點:根據伺服器的HTTP錯誤狀態代碼而重定向到自定義的錯誤頁面,注意要使<error>子節點下的配置生效,必須將<customErrors>節點節點的Mode屬性設置為「On」。
    • <httpHandlers>節點:添加或移除HTTP handler。根據用戶請求的URL和HTTP verb將用戶的請求交給相應的處理程序。可以在配置級別的任何層次配置此節點,也就是說可以針對某個特定目錄下指定的特殊文件進行特殊處理。
    • <httpmodule>節點: 添加或移除HTTP模塊以及諸如安全、日誌之類的應用方式。屬於應用程式級別的元素,不能配置於子目錄下的 web.config
    • <trace>節點:配置ASP.NET的跟蹤服務
    • <security>節點: ASP.NET的安全配置
    • <iisprocessmodel>節點:在IIS上配置ASP.NET的處理模式
    • <browercaps>節點:根據用戶代理指定瀏覽器的能力。配置瀏覽器的兼容部件
    • <identity> 為該應用程式指定標識
    • <machineKey> 控制驗證和解密的鑰匙
    • <processModel> 控制工作者進程的行為方式。屬於機器級別元素,只能用於machine.config。
    • <securityPolicy> 使用相關的策略文件定義信任等級
    • <trust> 選擇使用的信任等級.屬於應用程式級別的元素,不能配置於子目錄下的 web.config
    • <webServices> 指定Web服務的協議和範圍
    • <clientTarget>定義客戶目標
    • <httpRuntime>節點用於對 ASP.NET HTTP 運行庫設置。該節可以在計算機、站點、應用程式和子目錄級別聲明。屬性有:
      • executionTimeout="36000" 最大超時時間為36000秒
      • maxRequestLength="2097151" 用戶最大能上傳的文件為40M
      • requestLengthDiskThreshold="80"
      • useFullyQualifiedRedirectUrl="false"
      • minFreeThreads="8"
      • minLocalRequestFreeThreads="4"
      • appRequestQueueLimit="5000" 最大並發請求為5000個
      • enableKernelOutputCache="true"
      • enableVersionHeader="true"
      • enable="true"
      • shutdownTimeout="3600"
      • delayNotificationTimeout="5"
      • waitChangeNotification="0"
      • maxWaitChangeNotification="0"
      • enableHeaderChecking="true"
      • sendCacheControlHeader="true"
      • apartmentThreading="false"
    • <pages>節點用於表示對特定頁設置,主要有三個屬性:
      • buffer 是否啟用了 HTTP 響應緩衝。
      • enableViewStateMac 是否應該對頁的視圖狀態運行計算機身份驗證檢查 (MAC),以放置用戶篡改,默認為false,如果設置為true將會引起性能的降低。
      • validateRequest 是否驗證用戶輸入中有跨站點腳本攻擊和SQL注入式漏洞攻擊,默認為true,如果出現匹配情況就會。如果使用了不檢測,一要對用戶的輸入進行編碼或驗證
    • <sessionState>節點用於配置當前asp.net應用程式的會話狀態配置。屬於應用程式級別的元素,不能配置於子目錄下的 web.config
      • cookieless="false" 保存會話狀態
      • mode="InProc" :默認值。由asp.net輔助進程來存儲會話狀態數據;Custom 使用自定義數據來存儲會話狀態數據;Off 禁用會話狀態;SQLServer 使用進程外SQL Server數據庫保存會話狀態數據;StateServer 使用進程外 ASP.NET 狀態服務存儲狀態信息。默認情況下使用InProc模式來存儲會話狀態數據,這種模式的好處是存取速度快,缺點是比較佔用內存,所以不宜在這種模式下存儲大型的用戶會話數據。
      • timeout="30" 會話超時為30分鐘
      • stateConnectionString :指定Asp.net應用程式存儲遠程會話狀態的伺服器名,默認為本機
      • sqlConnectionString: 當用會話狀態數據庫時,在這裏設置連接字符串
    • <globalization>節點:用於配置應用程式的全球化設置。fileEncoding可選屬性:設置.aspx、.asmx 和 .asax 文件的存儲編碼。requestEncoding可選屬性:設置客戶端請求的編碼,默認為UTF-8。responseEncoding可選屬性:設置伺服器端響應的編碼,默認為UTF-8。

配置文件的讀寫操作[編輯]

雖然web.config文件是一個XML文件,但是由於權限的原因它在部署中不能像操作普通XML文件那樣進行修改,在.net中提供了一個類System.Configuration用於對web.config進行修改。

using System; 
using System.Configuration; 
using System.Web; 
using System.Web.Configuration; 
/// <summary> 
/// ConfigurationOperator 的摘要说明 
/// </summary> 
public class ConfigurationOperator:IDisposable 
{ 
    private Configuration config; 
 public ConfigurationOperator():this(HttpContext.Current.Request.ApplicationPath) 
 { 
         
 } 
    public ConfigurationOperator(string path) 
    { 
        config = WebConfigurationManager.OpenWebConfiguration(path); 
    } 
    /// <summary>  
    /// 设置应用程序配置节点,如果已经存在此节点,则会修改该节点的值,否则添加此节点 
    /// </summary>  
    /// <param name="key">节点名称</param>  
    /// <param name="value">节点值</param>  
    public void SetAppSetting(string key, string value) 
    { 
        AppSettingsSection appSetting = (AppSettingsSection)config.GetSection("appSettings"); 
        if (appSetting.Settings[key] == null)//如果不存在此节点,则添加  
        { 
            appSetting.Settings.Add(key, value); 
        } 
        else//如果存在此节点,则修改  
        { 
            appSetting.Settings[key].Value = value; 
        } 
    } 
    /// <summary>  
    /// 设置数据库连接字符串节点,如果不存在此节点,则会添加此节点及对应的值,存在则修改  
    /// </summary>  
    /// <param name="key">节点名称</param>  
    /// <param name="value">节点值</param>  
    public void SetConnectionString(string key, string connectionString) 
    { 
        ConnectionStringsSection connectionSetting = (ConnectionStringsSection)config.GetSection("connectionStrings"); 
        if (connectionSetting.ConnectionStrings[key] == null)//如果不存在此节点,则添加  
        { 
            ConnectionStringSettings connectionStringSettings = new ConnectionStringSettings(key, connectionString); 
            connectionSetting.ConnectionStrings.Add(connectionStringSettings); 
        } 
        else//如果存在此节点,则修改  
        { 
            connectionSetting.ConnectionStrings[key].ConnectionString = connectionString; 
        } 
    } 
    /// <summary>  
    /// 保存所作的修改  
    /// </summary>  
    public void Save() 
    { 
        config.Save(); 
        config = null; 
    } 
    public void Dispose() 
    { 
        if (config != null) 
        { 
            config.Save(); 
        } 
    } 
}

使用上述代碼:

using System; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Web.Configuration;//注意添加这个命名空间 
public partial class ConfigModifyDemo : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 
    protected void btnModify_Click(object sender, EventArgs e) 
    { 
        string appSetting = txtAppSetting.Text;//appSetting子节点值 
        string connectionString = txtConnectionString.Text;//连接字符串 
        string key = txtKey.Text;//appSetting子节点Key 
        string connectionName = txtConnectionName.Text;//连接Name 
        ConfigurationOperator op = new ConfigurationOperator(); 
        op.SetAppSetting(key, appSetting); 
        op.SetConnectionString(connectionName, connectionString); 
        op.Save(); 
    } 
     
}

搜索順序[編輯]

搜索順序:

  1. 如果在當前頁面所在目錄下存在web.config文件,查看是否存在所要查找的結點名稱,如果存在返回結果並停止查找。
  2. 如果當前頁面所在目錄下不存在web.config文件或者web.config文件中不存在該結點名,則查找它的上級目錄,直到網站的根目錄。
  3. 如果網站根目錄下不存在web.config文件或者web.config文件中不存在該節點名則在%windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/web.config文件中查找。
  4. 如果在%windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/web.config文件中不存在相應結點,則在%windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/machine.config文件中查找。
  5. 如果仍然沒有找到則返回null。

如果對某個網站或者某個文件夾有特定要求的配置,可以在相應的文件夾下創建一個web.config文件,覆蓋掉上級文件夾中的web.config文件中的同名配置即可。這些配置信息的尋找只查找一次,以後便被緩存起來供後來的調用。在asp.net應用程式運行過程中,如果web.config文件發生更改就會導致相應的應用程式重新啟動,這時存儲在伺服器內存中的用戶會話信息就會丟失(如存儲在內存中的Session)。一些軟件(如殺毒軟件)每次完成對web.config的訪問時就會修改web.config的訪問時間屬性,也會導致asp.net應用程式的重啟。

常見的配置[編輯]

connectionStrings配置(這個一般用來配置數據庫連接):

 <connectionStrings>
   <add name="Default" connectionString="Server=.; Database=Inferno;User ID=sa; Password=pwd123;MultipleActiveResultSets=true" providerName="System.Data.SqlClient" />
 </connectionStrings>

獲取:

 string dbStr=ConfigurationManager.ConnectionStrings["Default"].ConnectionString;

appSettings配置(這個一般用來配置不確定的或者需要用戶配置的內容)

<appSettings>
   <add key="webpages:Version" value="3.0.0.0" />
   <add key="webpages:Enabled" value="false" />
   <add key="ClientValidationEnabled" value="true" />
   <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>

獲取

string clientValidationEnabled= ConfigurationManager.AppSettings["ClientValidationEnabled"].ToString();