1. 程式人生 > >web.config配置詳細說明

web.config配置詳細說明

轉載自:http://www.cnblogs.com/amylis_chen/archive/2012/12/07/2807008.html

稍加修改。

(一).Web.Config是以XML檔案規範儲存,配置檔案分為以下格式

    1.配置節處理程式宣告
    特點:位於配置檔案的頂部,包含在<configSections>標誌中。

    2.特定應用程式配置
    特點: 位於<appSetting>中。可以定義應用程式的全域性常量設定等資訊.

    3.配置節設定
    特點: 位於<system.Web>節中,控制Asp.net執行時的行為.

    4.配置節組
    特點: 用<sectionGroup>標記,可以自定義分組,可以放到<configSections>內部或其它<sectionGroup>標記的內部.

    (二).配置節的每一節

    1.<configuration>節
    根元素,其它節都是在它的內部.
    
     2.<appSetting>節
    此節用於定義應用程式設定項。對一些不確定設定,還可以讓使用者根據自己實際情況自己設定
    用法:
     I.
        <appSettings>
           <add key="Conntction" value="server=192.168.85.66;userid=sa;password=;database=Info;"/>
        <appSettings>
        定義了一個連線字串常量,並且在實際應用時可以修改連線字串,不用修改程式程式碼.
    II.
        <appSettings>
          <add key="ErrPage" value="Error.aspx"/>
        <appSettings>
        定義了一個錯誤重定向頁面.
    III.

       <appSettings configSource="source/new.xml"/>可以通過新的XML來擴充套件配置內容。

      new.xml寫法為:

       <?xml version="1.0" encoding="utf-8" ?>

        <appSettings>

          <add key="" value="|"/>

        </appSettings>

    3.<compilation>節
    格式:
        <compilation defaultLanguage="c#" debug="true" />
     I.
        default language: 定義後臺程式碼語言,可以選擇C#和VB.net兩種語言.
     II.
        debug : 為true時,啟動aspx除錯;為false不啟動aspx除錯,因而可以提高應用程式執行時的效能。一般程式設計師在開發時設定為true,交給客戶時設定為false.

    4.<customErrors>節
    格式:
        <customErrors mode="RemoteOnly" defaultRedirect="error.aspx"
            <error statusCode="440" redirect="err440page.aspx"/>
            <error statusCode="500" redirect="err500Page.aspx"/>
        />
    I.
        mode : 具有On,Off,RemoteOnly 3種狀態。On表示始終顯示自定義的資訊; Off表示始終顯示詳細的asp.net錯誤資訊; RemoteOnly表示只對不在本地Web伺服器上執行的使用者顯示自定義資訊.
    II.
        defaultRedirect: 用於出現錯誤時重定向的URL地址. 是可選的
    III.
        statusCode: 指明錯誤狀態碼,表明一種特定的出錯狀態.
    IV.
        redirect:錯誤重定向的URL.

    5.<globalization>節
    格式:
        <globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" />
    I.
        requestEncoding: 它用來檢查每一個發來請求的編碼.
    II.
        responseEncoding: 用於檢查發回的響應內容編碼.
    III.
        fileEncoding: 用於檢查aspx,asax等檔案解析的預設編碼.

    6.<sessionState>節
    格式:
        <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
    I.
        mode: 分為off,Inproc,StateServer,SqlServer幾種狀態
    II.
        stateConnectionString :指定Asp.net應用程式儲存遠端會話狀態的伺服器名,預設為本機
    III.
        sqlConnectionString: 當用會話狀態資料庫時,在這裡設定連線字串
    IV.
        Cookieless: 設定為true時,表示不使用cookie會話狀態來標識客戶; 否則,相反.
    V.
        TimeOut: 用來定義會話狀態儲存的時間,超過期限,將自動終止會話.

1、off模式

從字面上就可以看出這個是關閉模式,如果當前頁面不需要session的值,為了減少伺服器資源,你可以去掉Session的開銷。

<sessionState mode="off">或者頁面上

<%@ Page EnableSessionState="false" %>來關閉Session。

2、inProc模式(預設模式)

它允許“無Cookie”的會話,以及在伺服器之外儲存
會話資料。ASP.NET會話狀態模組在Web.config檔案中像下面這樣配置:

<sessionState mode="InProc" cookieless="false" timeout="20" />

在這個例子中,mode屬性設為InProc(預設值),表明會話狀態要由ASP.NET儲存到記憶體中,而且
不用Cookie來傳遞會話ID。採取這種方式,不管Cookie還是隱藏表單欄位都用不著了。
所以,即使網頁中沒有使用表單,也能加入會話。 但是這種方法,應用程式的狀態將依賴於 ASP.NET程序, 當IIS程序崩潰或者正常重啟時,儲存在
程序中的狀態將丟失。

3、StateServer會話管理mos

將mode屬性設為StateServer,也就是將會話資料儲存到單獨的記憶體緩衝區中,再由單獨一臺機器上執行

的Windows服務來控制這個緩衝區。狀態服務全稱是“ASP.NET State Service ”(aspnet_state.exe),計算機管理-服務 裡面即可看到此服務,啟動該服務j

它由Web.config檔案中的stateConnectionString屬性來配置。該屬性指定了服務所在的伺服器,以及要監

視的埠:
<sessionState mode="StateServer" 
    stateConnectionString="tcpip=myserver:42424"
    cookieless="false" timeout="20" />
   
在這個例子中,狀態服務在一臺名為myserver的機器的42424埠(預設埠)執行。要在伺服器上改變

埠,可編輯HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters登錄檔項中的Port值。

顯然,使用狀態服務的優點在於程序隔離,並可在Web farm(網站群)中共享。 使用這種模式,會話狀態的儲存將不

依賴於iis程序的失敗或者重啟,然而,一旦狀態服務中止,所有會話資料都會丟失。換言之,狀態服務不

像SQL Server那樣能持久儲存資料;它只是將資料儲存在記憶體中。

4 用SQL Server進行會話管理 

   ASP.NET還允許將會話資料儲存到一個數據庫伺服器中,方法是將mode屬性變成SqlServer。 
在這種情況下,ASP.NET嘗試將會話資料儲存到由sqlConnectionString屬性(其中包含資料來源以及登入服

務器所需的安全憑證)指定的SQL Server中。


為了用恰當的資料庫物件來配置SQL erver,管理員還需要建立ASPState資料庫,
方法是執行WinDir\Microsoft.Net\Framework\Version資料夾中的InstallSqlState.sql指令碼(WinDir是服務

器的Windows資料夾,而Version是你使用的.NET框架版本的安裝資料夾)。


要配置SQL伺服器,可以在命令列中執行SQL Server 提供的命令列工具osql.exe

osql -S [ server name] -U [user] -P [password] -i InstallSqlState.sql
例如
osql -S (local)\NetSDK -U sa -P "" -i InstallSqlState.sql

在這裡使用者名稱必須是SQL伺服器上的sa帳號,或者具有同等許可權的其他帳號。有興趣的讀者可以開啟
這個指令碼檔案來了解ASP.NET是如何和SQL Server配合實現狀態管理的。  


   解除安裝這些表和儲存過程,可以使用UninstallSqlState.sql指令碼,使用方法與上面類似。做好必要的資料庫準備工作後,將web.config 檔案中的sessionstate 元素的mode改為"sqlserver"
,並且指定SQL連線字串。具體如下:

mode="sqlserver"
sqlConnectionString="data source=127.0.0.1; userid=sa; password="

配置好SQL Server後,應用程式程式碼執行時就和InProc模式沒有什麼區別。但要注意的是,由於資料不儲存在本地記憶體,所以儲存會話狀態的物件需要進行序列化和反序列化,以便通過網路傳給資料庫伺服器,以及從資料庫伺服器傳回。這當然會影響效能。通過在資料庫中儲存會話狀態,可分別針對擴充套件性及可靠性來有效地平衡效能。另外,可以利用SQL Server的叢集,使狀態儲存不依賴於單個的SQL Server, 這樣就可以為應用程式提供極大限度的可靠性。


    7.<authentication>節
    格式:
        <authentication mode="Forms">
          <forms name=".ASPXUSERDEMO" loginUrl="Login.aspx" protection="All" timeout="30"/>
          </authentication>
          <authorization>
          <deny users="?"/>
        </authorization>
    I.
        Windows: 使用IIS驗證方式
    II.
        Forms: 使用基於窗體的驗證方式
    III.
     Passport: 採用Passport cookie驗證模式
    IV.
        None: 不採用任何驗證方式

     裡面內嵌Forms節點的屬性涵義:
    I.
        Name: 指定完成身份驗證的Http cookie的名稱.
    II.
        LoginUrl: 如果未通過驗證或超時後重定向的頁面URL,一般為登入頁面,讓使用者重新登入
    III.
        Protection: 指定 cookie資料的保護方式.

        可設定為: All None Encryption Validation四種保護方式
            a. All表示加密資料,並進行有效性驗證兩種方式
            b. None表示不保護Cookie.
            c. Encryption表示對Cookie內容進行加密
            d. validation表示對Cookie內容進行有效性驗證
    IV.
        TimeOut: 指定Cookie的失效時間. 超時後要重新登入.

    從檔名就可以看出是做配置用的,比如配置自定義錯誤頁面,debug,等等
    存放連線字串是最基本的用法,
    高階一點可以配置httpmodule,httphandler...
    再高階一點可以寫一個繼承自IConfigurationSectionHandler,新增自定義的配置節...
    功能是很強大的
    ASP.NET提供了一個豐富而可行的配置系統,以幫助管理人員輕鬆快速的建立自己的WEB應用環境。    ASP.NET提供的是一個層次配置架構,可以幫助WEB應用、站點、機器分別配置自己的擴充套件配置資料。    ASP.NET的配置系統具有以下優點:
    ●ASP.NET允許配置內容可以和靜態內容、動態頁面和商業物件放置在同一應用的目錄結構下。當管理人員需要安裝新的ASP.NET應用時,只需要將應用目錄拷貝到新的機器上即可。
    ●ASP.NET的配置內容以純文字方式儲存,可以以任意標準的文字編輯器、XML解析器和指令碼語言解釋、修改配置內容。
    ●ASP.NET 提供了擴充套件配置內容的架構,以支援第三方開發者配置自己的內容。
    ●ASP.NET配置檔案的更修被系統自動監控,無須管理人員手工干預。


     4.2.2配置檔案的規則
    ASP.NET的配置檔案是基於XML格式的純文字檔案,存在於應用的各個目錄下,統一命名為“config.web”。它決定了所在目錄及其子目錄的配置資訊,並且子目錄下的配置資訊覆蓋其父目錄的配置。

    WINNT\Microsoft.NET\Framework\版本號\下的config.web為整個機器的根配置檔案,它定義了整個環境下的預設配置。

    預設情況下,瀏覽器是不能夠直接訪問目錄下的config.web檔案。

    在執行狀態下,ASP.NET會根據遠端URL請求,把訪問路徑下的各個config.web配置檔案疊加,產生一個唯一的配置集合。舉例來說,一個對URL:http://localhost/webapp/owndir/test.aspx的訪問,ASP.NET會根據以下順序來決定最終的配置情況:
    1..\Microsoft.NET\Framework\v.1.00\config.web (預設配置檔案)
    2..\webapp\config.web (應用的配置)
    3..\webapp\owndir\config.web (自己的配置)


    4.2.3配置檔案的語法規則

   (1)標識
    配置內容被置於config.web檔案中的標記<configuration>和</configuration>之間。
    格式:
        <configuration>
            配置內容…
        </configuration>

    (2)配置段控制代碼說明
    ASP.NET的配置檔案架構並未指定任何檔案格式或者是支援的配置屬性。相反的,它提出了“配置段控制代碼申明”的概念來支援任意的使用者定義配置段。
    格式:
        <configsections>
          <add name=欲定義配置段名 type=處理的控制代碼函式 />
        </configsections>

    (3)配置段
    具體定義配置的內容,供應用使用。

    以下例子定義了一個“httpmodules”配置段,設定了系統http相關的處理模組
<configuration>
     <configsections>
       <add name="httpmodules" type="System.Web.Configuration.HttpModules ConfigurationHandler" />
     </configsections>

    <httpmodules>
       <add type="System.Web.SessionState.CookielessSessionModule" />
      <add type="System.Web.Caching.OutputCacheModule" />
      <add type="System.Web.SessionState.SessionStateModule" />
       <add type="System.Web.Security.WindowsAuthenticationModule" />
      <add type="System.Web.Security.CookieAuthenticationModule" />
      <add type="System.Web.Security.PassportAuthenticationModule" />
      <add type="System.Web.Security.CustomAuthenticationModule" />
      <add type="System.Web.Security.UrlAuthorizationModule" />
       <add type="System.Web.Security.FileAuthorizationModule" />
    </httpmodules>
</configuration>


    4.2. 4   ASP.NET定義的標準配置段

(1)httpmodule    段: 定義了應用的http請求的處理模組以及諸如安全、日誌之類的應用方式
(2)httphandlers 段: 負責對映URLs到IhttpHandler類
(3)sessionstat    段: 負責配置http模組的會話狀態
(4)globalization   段:配置應用的公用設定
(5)compilation    段: 配置ASP.NET的編譯環境
(6)trace      段:配置ASP.NET的跟蹤服務
(7)security         段: ASP.NET的安全配置
(8)iisprocessmodel 段: 在IIS上配置ASP.NET的處理模式
(9)browercaps   段: 配置瀏覽器的相容部件


    4.2. 5    一個配置讀出的例子

(1)config.web配置檔案

    <!--config.web 請放入FormCfg.aspx所在目錄-->
      <configuration>
          <!--申明一個test配置段-->
          <configsections>
              <add name="test" type="System.Web.Configuration.DictionarySectionHandler" />
          </configsections>

          <test>
              <!--配置一個鍵key,其內容為just a configure test-->
              <add key="key" value="just a configure test" />
          </test>
      </configuration>

(2)讀出其內容

    <!--檔名:Application/FormCfg.aspx-->
    <html>
    <head>
    <script language="VB" runat=server>
        sub page_load(s as object ,e as eventargs)
        '取出test配置段的key鍵的值
        Dim CfgSection As Hashtable = Context.GetConfig("test")
         Dim Msg As String = CStr(CfgSection("key"))

        lblMsg.text=Msg
        end sub
    </script>
    <title>配置資訊的讀取</title>
    </head>
    <body>
        <center>
            config.web中"test"配置段中key的內容為: <asp:label id=lblmsg runat=server />
        </center>
     </body>
    </html>

(3)執行結果


    4.2. 6    Config.web配置例項
    <configuration>
        <!--定義使用者應用的公用設定,如SQL的sql連線串等等-->
        <appsettings></appsettings>

        <!--設定瀏覽器的相容性部件-->
        <browsercaps></browsercaps>

        <!--編譯環境設定,非除錯模式-->
        <compilation debugmode="false">

            <!--預設編譯語言為vb,以後可以不再在Page中定義指令碼語言-->
            <compilers defaultlanguage="vb">

            <!--以MSVSA.dll編譯.vb為字尾的VB檔案-->
            <compiler language="VB" extension=".vb" type="MSVSA.dll#Microsoft.VB.Compiler"/></compilers>

            <assemblies>
                <!--加入對System.Data的引用-->
                <add assembly="System.Data" />

                <!--去掉對System.Data的引用-->
                <remove assembly="System.IO" />

                <!--去掉config.web中包含或繼承來的引用-->
                <clear />
            </assemblies>
        </compilation>

        <!--設定應用全域性環境-->
            <!--檔案、請求、返回以gb2312編碼,以保證瀏覽器正確顯示中文-->
            <globalization fileencoding="gb2312" requestencoding="gb2312" responseencoding="gb2312"/>

            <!--定義使用者出錯的處理-->
            <!--出錯預設顯示defaultredirect指定的頁面,mode為on時,遵循customerrors配置段-->
            <!--mode為off時,忽略使用者出錯,mode為remoteonly時,本地才顯示真正的出錯原因-->
            <customerrors defaultredirect="AnErrorHasOccured.aspx?ErrNum=-1" mode="remote">

                <!--當出錯碼為500時,顯示redirect指定的頁面-->
                <error statuscode="500" redirect="AnErrorHasOccured.aspx?ErrNum=500"/>
            </customerrors>

            <!--指定目錄webapp的訪問許可權-->
            <location path="webapp” >
                <!--非授權使用者不能進入webapp目錄-->
                <security>
                <authorization>
                <deny users="?" />
                </authorization>
                </security>
             </location>

            <!--定義安全屬性-->
             <security>
                <authorization>

                <!--角色為Adminstrators和所有的使用者訪問其指定的資源-->
                <allow roles="Adminstrators"/>
                <allow users="*" />
                 </authorization>
             </security>
    </configuration>

 <configuration>//頂層元素
<system.web>//大多應用程式設定位於此元素下
<sessionState mode='Inproc' timeout='10' />//設定會話狀態超時時間
</system.web>
</configuration>

Table 3-1.可用於web.config的頂層配置元素

元素Element

含義Purpose

<authentication>

指定所使用的客戶身份驗證模式Specify the client authentication mode to use

<authorization>

允許或者拒絕使用者或角色的訪問Allow or deny users or roles access

<browserCaps>

根據使用者代理指定瀏覽器的能力Specify browser capabilities based on user agent

<clientTarget>

定義客戶目標Define client targets

<compilation>

控制同頁編譯和程式集引用Control page compilation and assembly references

<customErrors>

控制錯誤頁顯示和定義自定義的錯誤頁Control error page display and define custom error pages

<globalization>

設定請求和響應的編碼Set the request and response encoding

<httpHandlers>

新增或移除HTTP處理程式Add or remove HTTP handlers

<httpModules>

新增或移除HTTP模組Add or remove HTTP modules

<httpRuntime>

控制HTTP請求的處理Control aspects of HTTP request processing

<identity>

為該應用程式指定標識Specify impersonation for this application

<machineKey>

控制驗證和解密的鑰匙Control the validation and decryption key

<pages>

設定全域性的網頁預設屬性Set defaults for page attributes globally

<processModel>

控制工作者程序的行為方式Control the behavior of the worker process

<securityPolicy>

使用相關的策略檔案定義信任等級Define trust levels with associated policy files

<sessionState>

控制會話狀態Control session state

<trace>

啟用應用程式範圍的跟蹤Enable application-wide tracing

<trust>

選擇使用的信任等級Select which trust level to use

<webServices>

指定Web服務的協議和範圍Specify Web service protocols and extensions

<appSettings>

新增應用程式專用的資料元素Add application-specific data elements


1, 配置的四個層次

(1)機器:machine.config:位於$FRAMEWORK\CONFIG($FRAMEWORK一般是c:\winnt\Microsoft.NET\Framework\v1.0.3705),
是.net必須備的預設配置檔案。
web.config用來修改.net預設配置。
(2)站點:web站點根目錄下的web.config,影響全站配置
(3)程式:應用程式虛目錄根下的web.config,影響全虛目錄配置
(3)子目錄:虛目錄的子目錄下的web.config,影響該子目錄及其子目錄下配置

Figure 3-1. Hierarchy of Configuration Files

[圖片]

2,通過location元素簡化web.config配置:

Listing 3-2 Using the location Element

<configuration>
<location path="bar">//作用就相當於在bar目錄下配置了指定的web.config配置
<system.web>
<httpHandlers>
<remove verb="*" path="*.ashx" />
</httpHandlers>
</system.web>
</location>
</configuration>


3,元素的配置規定:
authentication, sessionState, trust, 和 httpModules(即使在老版本.net允許在子目錄中配置,也是不生效的)元素屬於應用程式級別的元素,不能配置於子目錄下的 web.config。processModel屬於機器級別元素,只能用於machine.config。

4,元素的更改生效時間:
一般web.config更改後,會自動重新載入程式,並放棄原程序的會話狀態和程式狀態。如果是processModel更改,只有終止工作者程序(可手工IIS復位,可撤銷aspnet_wp.exe程序,也可因程序意外反彈自身)然後重新啟動,才能應用新配置,同時放棄所有運行於該機器上的.net 程式狀態,快取資料和會話狀態。

5,IIS與web.config配置
如果使用了IIS,則IIS的安全配置等優秀於.net配置。如此可以只使用IIS預設配置,而在web.config中具體配置。

二,常量配置appSettings
使用appSettings元素的add子元素的key和value屬性(鍵值不分大小寫)來儲存常量設定。

Listing 3-3 Specifying Application-Specific Configuration Data

<!— File: web.config —>
<configuration>
<appSettings>
<add key="DSN"
value="server=localhost;uid=sa;pwd=;database=pubs"
/>
<add key="bgColor" value="white" />
</appSettings>
</configuration>
程式啟動後,配置就載入記憶體,有訪問許可權(.net使用HttpForbiddenHandler來控制對.config.cs, .vb, .asax, .resx檔案的訪問許可權,預設下外部程式不可訪問配置檔案)的程式就可以使用ConfigurationSettings.AppSettings ["DSN"]的方式直接引用配置的值。

Listing 3-4 Retrieving appSettings Configuration Data

<!— File: samplepage.aspx —>
<%@ Page Language='C#' %>
<%@ Import Namespace='System.Configuration' %>

<script runat=server>
protected void Page_Load(object src, EventArgs e)
{
string dsn = ConfigurationSettings.AppSettings["DSN"];
// use dsn to connect to a database...

string bgColor =
ConfigurationSettings.AppSettings["bgColor"];
// use retrieved background color...
}
</script>

<!— remainder of page not shown —>

三,程序配置processModel
只能在machine.config中使用processModel,其改動只在aspnet_wp.exe程序重啟後生效,並由unmanaged (非託管?)的aspnet_isapi.dll(ISAPI擴充套件dll)讀取,而非象其他配置一樣由managed mechanism(託管機制?)讀取。

Table 3-2. Attributes of the processModel Element

Attribute

Values

Default

Description

Enable

true | false

true

指定ASP.NET是駐留在外部工作者程序中(true),還是直接在inetinfo.exe中(false)
Whether ASP.NET is hosted in an external worker process (true) or directly in inetinfo.exe (false)

timeout

Infinite | HH:MM:SS

Infinite

程序的總生命期——超時後程序反彈Total life of a process—process bounced after timeout

idleTimeout

Infinite | HH:MM:SS

Infinite

程序的總空閒期——當到達超時時間時程序反彈Total idle life of a process—process bounced when reached

shutdownTimeout

Infinite | HH:MM:SS

0:00:05

在撤消程序之前,給予程序關閉的時間Time given to process to shut down before being killed

requestLimit

Infinite | number

Infinite

程序反彈之前,要服務的總需求量Total number of requests to serve before bouncing process

requestQueueLimit

Infinite | number

5000

程序反彈之前.所允許的在佇列中等待的請求數量
Number of queued requests allowed before bouncing process

restartQueueLimit

Infinite | number

10

程序重啟時.在佇列中等待的請求量Number of requests kept in queue while process is restarting

memoryLimit

Number

60

程序反彈之前.允許程序使用的實體記憶體百分數Percentage of physical memory process is allowed to use before bouncing process

webGarden

true | false

false

指定程序是否與特定CPU建立密切關係(對於多CPU機器)Whether process should be affinitized with a particular CPU (for multi-CPU machines)

cpuMask

Bitmask

0xffffffff

控制ASP.NET工作者程序所用的CPU數
(webGarden必須為true)Controls number of CPUs available for ASP.NET worker processes (webGarden must be true)

userName

SYSTEM | MACHINE | username

MACHINE

執行工作者程序所需的Windows身份
(MACHINE使用低特權的ASPNET賬號)Windows identity to run the worker process in (MACHINE uses low-privileged ASPNET account)

Password

AutoGenerate | password

AutoGenerate

username的密碼Password for username

logLevel

All | None | Errors

Errors

登記在事件日誌中的事件型別Event types logged to event log

clientConnectedCheck

HH:MM:SS

0:00:05

執行客戶連線的檢查前.請求保留在佇列中的時間Time a request is left in the queue before a client-connected check is performed

comAuthenticationLevel

Default | None | Connect | Call | Pkt | PktIntegrity | PktPrivacy

Connect

DCOM的安全性身份驗證的級別Level of authentication for DCOM security

comImpersonationLevel

Default | Anonymous | Identify | Impersonate | Delegate

Impersonate

COM的安全性身份驗證的級別Authentication level for COM security

responseRestartDeadlockInterval

Infinite | HH:MM:SS

00:09:00

由於responseRestart-DeadlockInterval而重啟工作者程序所需的等待時間Time to wait between restarting worker process because of responseRestartDeadlockInterval

responseDeadlockInterval

Infinite| HH:MM:SS

00:03:00

在佇列中有等待的請求時,為監測死鎖而設定的響應超時For deadlock detection, timeout for responses when there are queued requests

maxWorkerThreads

Number

25

執行緒池中每個CPU的最多工作者執行緒量
Maximum number of I/O threads per CPU in the thread pool

maxIoThreads

Number

25

執行緒池中每個CPU的最多I./O執行緒量Maximum number of I/O threads per CPU in the thread pool

serverErrorMessageFile

File name

""

“Server Unavailable"訊息的自定義Customization for "Server Unavailable" message


  雖然如上有眾多條件能使程序反彈,但預設下只有兩個反彈條件:一是程式佔用了60%以上的實體記憶體(該條件由memoryLimit屬性來指定),二是有5000多個請求在佇列中等待。常用的反彈條件還有明確的超時時間 (timeout),空閒超時時間(累計空閒時間idleTimeout),工作者程序的服務數量上限(requestLimit)。
  可以通過設定webGarden和 cpuMask來設定多cpu的使用方式

Listing 3-5 Specifying Multiple Worker Processes on a Multi-CPU machine

<processModel enable="true"
timeout="Infinite"
idleTimeout="Infinite"
shutdownTimeout="0:00:05"
requestLimit="Infinite"
requestQueueLimit="5000"
restartQueueLimit="10"
memoryLimit="60"
webGarden="true"//啟用該配置後,每個cpu執行一個工作者程序,程序間不能共享會話狀態,資料快取,程式狀態
cpuMask="0x00000007"//相當於二進位制0...0111遮蔽,則只使用cpu0,cpu1,cpu2,遮蔽其他cpu
userName="machine"
password="AutoGenerate"
logLevel="Errors"
clientConnectedCheck="0:00:05"
comAuthenticationLevel="Connect"
comImpersonationLevel="Impersonate"
responseRestartDeadlockInterval="00:09:00"
responseDeadlockInterval="00:03:00"
maxWorkerThreads="25"
maxIoThreads="25" />


  還可以設定maxIoThreads和maxWorkerThreads來控制CPU。(前者一定是I/O(如流或管道)實現埠,後者則是傳統非限制流程。由於目前IIS採用非同步寫已命名管道的方法來處理請求(IIS6直接集成了asp.net,所以不必通過已命名管道而是在工作者執行緒中直接處理請求),所以.net主要也在I/O中處理請求。)預設的執行緒設定是25/CPU,一般已經夠用。當需要設定超過25直到100執行緒時,需要謹慎檢查是否有異常。

1, 讀取程序資訊
使用ProcessModelInfo(兩個獲得當前或剛終止工作者程序休息的方法,都呼叫ProcessInfo類)和ProcessInfo(儲存工作者程序的資訊)兩個靜態類來讀取程序資訊

Listing 3-6 ProcessModelInfo and ProcessInfo Classes

public class ProcessModelInfo
{
public static ProcessInfo GetCurrentProcessInfo();
public static ProcessInfo[] GetHistory(int num);
}

public class ProcessInfo
{
public TimeSpan Age {get;}//年齡
public int PeakMemoryUsed {get;}//已使用最大記憶體數
public int ProcessID {get;}//程序ID
public int RequestCount {get;}//已服務的請求數
public ProcessShutdownReason ShutdownReason {get;}//關閉原因
public DateTime StartTime {get;}//開始時間
public ProcessStatus Status {get;}//狀態
}

Figure 3-3. Sample ProcessModelInfo Output

[圖片]


2 , IIS6.0程序模型的改變(相對IIS5的隔離方式)
  在IIS6.0中,ProcessModel在IIS元資料庫中被對等設定代替,現在以XML形式放在metabase.xml檔案中,所以忽略了 machine.config中的ProcessModel元素。而且程序不再是ASPNET_wp.exe,而是一個或多個w3wp.exe中,因為已經不限制一個cpu只能一個工作者程序。我們可以配置應用程式池(包含共享相同工作者程序的虛目錄集),通過比ProcessModel更多更靈活的設定來控制程序(迴圈次數/天,分離虛擬記憶體極限,實際記憶體極限,cpu使用監視,cpu過載的回收,應用程式池禁用的錯誤數量極限,啟動和關閉時間限制)。
  另外,使用http.sys的核心模式來偵聽處理Http請求,而不再是inetinfo.exe。這樣就不在程序中而是在系統服務核心中處理Http要求,於是即使使用者模式程序出現缺陷甚至崩潰,都不會影響服務核心。

四,附屬設定

1,assemblies元素
  在web.config中使用@Assembly,可以全域性引用GAC部署的應用程式。

Listing 3-7 Adding an Application-wide Reference to a GAC-Deployed Assembly

<configuration>
<!— ... —>
<system.web>
<compilation>
<assemblies>
<add assembly="Util, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a77a5c561934e089" />
</assemblies>
</compilation>
</system.web>
</configuration>
2,pages元素
  在web.config中使用@page指令,可以統一改變應用程式的page預設設定。

Listing 3-8 Using the pages Element

<configuration>
<!— ... —>
<system.web>
<pages enableViewState='false' />
</system.web>
</configuration>
五,讀取配置資訊
  除了通過ConfigurationSettings.AppSettings["xxx"]來訪問儲存在AppSettings中的值外,通常用 ConfigurationSettings.GetConfig()方法,請求從快取中讀取,如未快取就請求直接從配置檔案讀入記憶體, ConfigurationRecord類使用XmlTextReader類可以直接讀取最低層配置的物理xml檔案。

Listing 3-9 Reading Configuration Settings

object settings =
ConfigurationSettings.GetConfig("appSettings");
NameValueCollection nvc = settings as NameValueCollection;
if (nvc != null)
{
string val = (string)nvc["xxx"];
}

除了web.config這樣的配置的元資料,還有配置的處理程式(解析配置使其獲得高擴充套件性,並在正式讀取配置時建立類,同時傳送物件的例項建立,開始傳送相關配置)。如下圖:machine.config中,compilation元素由 CompilationConfigurationHandler類來解析,該類於configSections元素下指定,同時也屬於 sectionGroup元素(進一步確定分析範圍是 system.web)。另外一個元素appSettings由NameValueFileSectionHandler負責解析,該元素位於配置檔案的頂層。

Figure 3-4. Configuration Section Handlers in machine.config

[圖片]

每個configSections中的元素都必須實現IConfigurationSectionHandler介面,該介面有一個簡單的方法 Create。當配置處理程式的標籤被讀入時,ConfigurationRecord類(頂層配置檔案解析器)呼叫Create方法。同時,處理程式獲得上層配置資訊(如果有上層配置的話)和當前HttpConfigurationContext物件(通過輸入引數),以及對 XmlNode的引用(最重要資訊,由配置處理程式負責解析)。通常處理程式(函式)會遍歷XmlNode的每個子節點和屬性,返回一個物件,包含所有狀態資訊。在快取上述狀態資訊後,應用程式就可通過ConfigurationSettings.GetConfig()全域性引用該狀態資訊。

Listing 3-10 IConfigurationSectionHandler Interface

public interface IConfigurationSectionHandler
{
object Create(object parent, object input, XmlNode node);
}
asp.net配置部份的處理程式各自都會在記憶體中建立一個state retainer(狀態保持器),如CompilerConfiguration類(compilation元素資訊), PagesConfiguration類(pages元素資訊 )等。這些配置例項類(都是內部類,不可直接訪問,asp.net用它們來設定其建立類中的預設值和其它值)都儲存在一個全域性的雜湊表中,可以用 ConfigurationSettings.GetConfig()來訪問該雜湊表。

Figure 3-5. In-memory Configuration Settings Layout

[圖片]



六,建立自定義的配置處理程式
除了儲存在appSettings元素中之外,還可以自定義配置元素。如下:

Listing 3-11 Sample Custom Configuration Element

<!— File: web.config —>
<configuration>
<acmeGroup>
<acme>//指定自定義元素
<font>Courier New</font>
<backgroundColor>Green</backgroundColor>
<underlineLinks>true</underlineLinks>
<horizontalWidth>600</horizontalWidth>
<verticalWidth>800</verticalWidth>
</acme>
</acmeGroup>
</configuration>
首先,我們要建立用於儲存配置狀態資訊的儲存機制。
一種較簡單的方法是定義一個類(如AcmeSettings類),用其中的公有資料成員來儲存對應的配置元素。

Listing 3-12 Sample Custom Configuration Settings State Class

// File: AcmeSettings.cs
namespace EssentialAspDotNet.Config
{
public class AcmeSettings
{
public string Font;
public string BackgroundColor;
public bool UnderlineLinks;
public int HorizontalWidth;
public int VerticalWidth;
}
}
然後,我們要建立一個實現IConfigurationSectionHandler介面的類,用於解析配置檔案中自定義部份,並將其狀態資訊儲存到acmeSettings類中。

Listing 3-13 Sample Custom Configuration Section Handler

// File: AcmeConfigHandler.cs
namespace EssentialAspDotNet.Config
{
public class AcmeConfigHandler :
IConfigurationSectionHandler
{
public object Create(object parent, object input,
XmlNode node)
{
AcmeSettings aset = new AcmeSettings();

foreach (XmlNode n in node.ChildNodes)
{
switch (n.Name)
{
case ("font"):
aset.Font = n.InnerText;
break;
case ("backgroundColor"):
aset.BackgroundColor = n.InnerText;
break;
case ("underlineLinks"):
aset.UnderlineLinks = bool.Parse(n.InnerText);
break;
case ("horizontalWidth"):
aset.HorizontalWidth = int.Parse(n.InnerText);
break;
case ("verticalWidth"):
aset.VerticalWidth = int.Parse(n.InnerText);
break;
}
}
return aset;
}
}
}
最後要通知,我們要用該類解析配置檔案中的acme元素。為此,我們在配置檔案的configSections中新增一個section元素,用於讀取並解析配置檔案。(系統範圍的machine.config檔案,站點範圍和應用程式範圍的web.config檔案都能新增Section元素)

Listing 3-14 Installing a Custom Configuration Section Handler

<!— File: web.config —>
<configuration>
<configSections>
<sectionGroup name="acmeGroup">
<section name="acme"
type="EssentialAspDotNet.Config.AcmeConfigHandler, AcmeConfigHandler"
/>
</sectionGroup>
</configSections>
<!— ... —>
</configuration>
現在,應用程式中的所有網頁或者程式碼塊,都能使用ConfigurationSettings.GetConfig()方法訪問該配置資訊,傳遞我們建立的部份