認識Web.config

一、認識Web.config文件

Web.config 文件是一個XML文本文件,它用來儲存 ASP.NET Web 應用程序的配置信息(如最常用的設置ASP.NET Web 應用程序的身份驗證方式),它可以出現在應用程序的每一個目錄中。當你通過.NET新建一個Web應用程序後,默認情況下會在根目錄自動創建一個默認的Web.config文件,包括默認的配置設置,所有的子目錄都繼承它的配置設置。如果你想修改子目錄的配置設置,你可以在該子目錄下新建一個Web.config文件。它可以提供除從父目錄繼承的配置信息以外的配置信息,也可以重寫或修改父目錄中定義的設置。

().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>

定義了一個錯誤重定向頁面.

3.<compilation>

格式:

<compilation

defaultLanguage="c#"

debug="true"

/>

I.default language: 定義後臺代碼語言,可以選擇C#VB.net兩種語言.

IIdebug : 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幾種狀態

這裏有詳細介紹此屬性: http://blog.csdn.net/chengking/archive/2005/10/27/518079.aspx

II. stateConnectionString :指定Asp.net應用程序存儲遠程會話狀態的服務器名,默認爲本機

III.sqlConnectionString: 當用會話狀態數據庫時,在這裏設置連接字符串

IV. Cookieless: 設置爲true時,表示不使用cookie會話狀態來標識客戶; 否則,相反.

V. TimeOut: 用來定義會話狀態存儲的時間,超過期限,將自動終止會話.

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的失效時間. 超時後要重新登錄.

 

在運行時對Web.config文件的修改不需要重啓服務就可以生效(注:<processModel> 節例外)。當然Web.config文件是可以擴展的。你可以自定義新配置參數並編寫配置節處理程序以對它們進行處理。

 

web.config配置文件(默認的配置設置)以下所有的代碼都應該位於

<configuration>

<system.web>

</system.web>

</configuration>

之間,出於學習的目的下面的示例都省略了這段XML標記。

 

 

 

1<authentication>

作用:配置 ASP.NET 身份驗證支持(爲WindowsFormsPassPortNone四種)。該元素只能在計算機、站點或應用程序級別聲明。< authentication> 元素必需與<authorization> 節配合使用。

 

 

 

示例:

 

以下示例爲基於窗體(Forms)的身份驗證配置站點,當沒有登陸的用戶訪問需要身份驗證的網頁,網頁自動跳轉到登陸網頁。

<authentication mode="Forms" >

<forms loginUrl="logon.aspx" name=".FormsAuthCookie"/>

</authentication>

其中元素loginUrl表示登陸網頁的名稱,name表示Cookie名稱。

 

2<authorization>

作用:控制對 URL 資源的客戶端訪問(如允許匿名用戶訪問)。此元素可以在任何級別(計算機、站點、應用程序、子目錄或頁)上聲明。必需與<authentication> 節配合使用。

 

 

 

示例:以下示例禁止匿名用戶的訪問

<authorization>

   <deny users="?"/>

</authorization>

注:你可以使用user.identity.name來獲取已經過驗證的當前的用戶名;可以使用web.Security.FormsAuthentication.RedirectFromLoginPage方法將已驗證的用戶重定向到用戶剛纔請求的頁面.具體的

 

3<compilation>

作用:配置 ASP.NET 使用的所有編譯設置。默認的debug屬性爲“True.在程序編譯完成交付使用之後應將其設爲FalseWeb.config文件中有詳細說明,此處省略示例)

 

 

 

4<customErrors>

作用:爲 ASP.NET 應用程序提供有關自定義錯誤信息的信息。它不適用於 XML Web services 中發生的錯誤。

 

示例:當發生錯誤時,將網頁跳轉到自定義的錯誤頁面。

<customErrors defaultRedirect="ErrorPage.aspx" mode="RemoteOnly">

</customErrors>

其中元素defaultRedirect表示自定義的錯誤網頁的名稱。mode元素表示:對不在本地 Web 服務器上運行的用戶顯示自定義(友好的)信息。

 

 

 

5<httpRuntime>

作用:配置 ASP.NET HTTP 運行庫設置。該節可以在計算機、站點、應用程序和子目錄級別聲明。

 

 

 

示例:控制用戶上傳文件最大爲4M,最長時間爲60秒,最多請求數爲100

<httpRuntime maxRequestLength="4096" executionTimeout="60" appRequestQueueLimit="100"/>

 

6 <pages>

作用:標識特定於頁的配置設置(如是否啓用會話狀態、視圖狀態,是否檢測用戶的輸入等)。<pages>可以在計算機、站點、應用程序和子目錄級別聲明。

 

 

 

示例:不檢測用戶在瀏覽器輸入的內容中是否存在潛在的危險數據(注:該項默認是檢測,如果你使用了不檢測,一要對用戶的輸入進行編碼或驗證),在從客戶端回發頁時將檢查加密的視圖狀態,以驗證視圖狀態是否已在客戶端被篡改。(注:該項默認是不驗證)

<pages buffer="true" enableViewStateMac="true" validateRequest="false"/>

 

7<sessionState>

作用:爲當前應用程序配置會話狀態設置(如設置是否啓用會話狀態,會話狀態保存位置)。

 

 

 

示例:

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

</sessionState>

注:

mode="InProc"表示:在本地儲存會話狀態(你也可以選擇儲存在遠程服務器或SAL服務器中或不啓用會話狀態)

cookieless="true"表示:如果用戶瀏覽器不支持Cookie時啓用會話狀態(默認爲False

timeout="20"表示:會話可以處於空閒狀態的分鐘數

 

8<trace>

作用:配置 ASP.NET 跟蹤服務,主要用來程序測試判斷哪裏出錯。

 

 

 

示例:以下爲Web.config中的默認配置:

<trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" />

注:

enabled="false"表示不啓用跟蹤;

requestLimit="10"表示指定在服務器上存儲的跟蹤請求的數目

pageOutput="false"表示只能通過跟蹤實用工具訪問跟蹤輸出;

traceMode="SortByTime"表示以處理跟蹤的順序來顯示跟蹤信息

localOnly="true" 表示跟蹤查看器 (trace.axd) 只用於宿主 Web 服務器

 

自定義Web.config文件配置

 

自定義Web.config文件配置節過程分爲兩步。

1.在在配置文件頂部 <configSections> </configSections>標記之間聲明配置節的名稱和處理該節中配置數據的 .NET Framework 類的名稱。

2.是在 <configSections> 區域之後爲聲明的節做實際的配置設置。

 

 

 

示例:創建一個節存儲數據庫連接字符串

<configuration>

  <configSections>

  <section name="appSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

</configSections>

  <appSettings>

   <add key="scon" value="server=a;database=northwind;uid=sa;pwd=123"/>

  </appSettings>

  <system.web>

   ......

  </system.web>

</configuration>

 

訪問Web.config文件 你可以通過使用ConfigurationSettings.AppSettings 靜態字符串集合來訪問 Web.config 文件示例:獲取上面例子中建立的連接字符串。例如:

protected static string Isdebug = ConfigurationSettings.AppSettings["debug"]

 

 

 

 

 

二、web.config中的session配置詳解

打開某個應用程序的配置文件Web.config後,我們會發現以下這段:

< sessionState

  mode="InProc"

  stateConnectionString="tcpip=127.0.0.1:42424"

  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"

  cookieless="false"

  timeout="20"

/>

  這一段就是配置應用程序是如何存儲Session信息的了。我們以下的各種操作主要是針對這一段配置展開。讓我們先看看這一段配置中所包含的內容的意思。sessionState節點的語法是這樣的:

< sessionState mode="Off|InProc|StateServer|SQLServer"

             cookieless="true|false"

             timeout="number of minutes"

             stateConnectionString="tcpip=server:port"

             sqlConnectionString="sql connection string"

             stateNetworkTimeout="number of seconds"

/>

 

必須有的屬性是 屬性 選項 描述

mode 設置將Session信息存儲到哪裏

Ø         Off 設置爲不使用Session功能,

Ø         InProc 設置爲將Session存儲在進程內,就是ASP中的存儲方式,這是默認值,

Ø         StateServer 設置爲將Session存儲在獨立的狀態服務中,

Ø         SQLServer 設置將Session存儲在SQL Server中。

 

 

 

 

 

可選的屬性是: 屬性 選項 描述

Ø         cookieless 設置客戶端的Session信息存儲到哪裏,

Ø         ture 使用Cookieless模式,

Ø         false 使用Cookie模式,這是默認值,

Ø         timeout 設置經過多少分鐘後服務器自動放棄Session信息,默認爲20分鐘。

stateConnectionString 設置將Session信息存儲在狀態服務中時使用的服務器名稱和端口號,例如:"tcpip=127.0.0.1:42424。當mode的值是StateServer是,這個屬性是必需的。

sqlConnectionString 設置與SQL Server連接時的連接字符串。例如"data source= localhost;Integrated Security=SSPI;Initial Catalog=northwind"。當mode的值是 SQLServer時,這個屬性是必需的。

stateNetworkTimeout 設置當使用StateServer模式存儲Session狀態時,經過多少秒空閒後,斷開Web服務器與存儲狀態信息的服務器的TCP/IP連接的。默認值是10秒鐘。

 

 

 

 

 

ASP.NET中客戶端Session狀態的存儲

  在我們上面的Session模型簡介中,大家可以發現Session狀態應該存儲在兩個地方,分別是客戶端和服務器端。客戶端只負責保存相應網站的SessionID,而其他的Session信息則保存在服務器端。在ASP中,客戶端的SessionID實際是以Cookie的形式存儲的。如果用戶在瀏覽器的設置中選擇了禁用Cookie,那末他也就無法享受Session的便利之處了,甚至造成不能訪問某些網站。爲了解決以上問題,在 ASP.NET中客戶端的Session信息存儲方式分爲:CookieCookieless兩種。

  ASP.NET中,默認狀態下,在客戶端還是使用Cookie存儲Session信息的。如果我們想在客戶端使用Cookieless的方式存儲Session信息的方法如下:

  找到當前Web應用程序的根目錄,打開Web.Config文件,找到如下段落:

< sessionState

  mode="InProc"

  stateConnectionString="tcpip=127.0.0.1:42424"

  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"

  cookieless="false"

  timeout="20"

/>

  這段話中的cookieless="false"改爲:cookieless="true",這樣,客戶端的Session信息就不再使用 Cookie存儲了,而是將其通過URL存儲。關閉當前的IE,打開一個新IE,重新訪問剛纔的Web應用程序,就會看到類似下面的樣子:

其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245) /default.aspx中黑體標出的就是客戶端的Session ID。注意,這段信息是由IIS自動加上的,不會影響以前正常的連接。

 

 

 

ASP.NET中服務器端Session狀態的存儲 準備工作:

  爲了您能更好的體驗到實驗現象,您可以建立一個叫做SessionState.aspx的頁面,然後把以下這些代碼添加到< body>< /body>中。

< scriptrunat="server">

Sub Session_Add(sender As Object, e As EventArgs)

  Session("MySession") = text1.Value

  span1.InnerHtml = "Session data updated! < P>Your session contains: < font color=red>" & Session("MySession"). ToString() & "< /font>"

End Sub

Sub CheckSession(sender As Object, eAs EventArgs)

  If (Session("MySession")Is Nothing) Then

    span1.InnerHtml = "NOTHING, SESSION DATA LOST!"

  Else

    span1.InnerHtml = "Your session contains: < font color= red>" & Session("MySession").ToString() & "<   /font>"

End If

End Sub

< /script>

< formrunat="server"id="Form2">

  < inputid="text1"type="text"runat="server"name="text1">

  < inputtype="submit"runat="server"OnServerClick="Session_Add"

      value="Add to Session State " id="Submit1"name="Submit1">

  < inputtype="submit"runat="server"OnServerClick="CheckSession"

      value=" View Session State " id="Submit2"name="Submit2">

< /form>

< hrsize="1">

< fontsize="6">< spanid="span1"runat="server" />< /font>

  這個SessionState.aspx的頁面可以用來測試在當前的服務器上是否丟失了Session信息。

 

 

 

 

 

將服務器Session信息存儲在進程中

  讓我們來回到Web.config文件的剛纔那段段落中:

< sessionState

  mode="InProc"

  stateConnectionString="tcpip=127.0.0.1:42424"

  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"

  cookieless="false"

  timeout="20"

/>

  當mode的值是InProc時,說明服務器正在使用這種模式。

  這種方式和以前ASP中的模式一樣,就是服務器將Session信息存儲在IIS進程中。當IIS關閉、重起後,這些信息都會丟失。但是這種模式也有自己最大好處,就是性能最高。應爲所有的Session信息都存儲在了IIS的進程中,所以IIS能夠很快的訪問到這些信息,這種模式的性能比進程外存儲Session信息或是在SQL Server中存儲Session信息都要快上很多。這種模式也是ASP.NET的默認方式。

  好了,現在讓我們做個試驗。打開剛纔的SessionState.aspx頁面,隨便輸入一些字符,使其存儲在Session中。然後,讓我們讓IIS重起。注意,並不是使當前的站點停止再開始,而是在IIS中本機的機器名的節點上點擊鼠標右鍵,選擇重新啓動IIS(想當初使用NT4時,重新啓動IIS必須要重新啓動計算機才行,微軟真是@#$%^&)返回到SessionState.aspx頁面中,檢查剛纔的Session信息,發現信息已經丟失了。

 

 

 

將服務器Session信息存儲在進程外

  首先,讓我們來打開管理工具->服務,找到名爲:ASP.NET State Service的服務,啓動它。實際上,這個服務就是啓動一個要保存Session信息的進程。啓動這個服務後,你可以從Windows任務管理器->進程中看到一個名爲 aspnet_state.exe的進程,這個就是我們保存Session信息的進程。

  然後,回到Web.config文件中上述的段落中,將mode的值改爲StateServer。保存文件後的重新打開一個IE,打開 SessionState.aspx頁面,保存一些信息到Session中。這時,讓我們重起IIS,再回到SessionState.aspx頁面中查看剛纔的Session信息,發現沒有丟失。

  實際上,這種將Session信息存儲在進程外的方式不光指可以將信息存儲在本機的進程外,還可以將Session信息存儲在其他的服務器的進程中。這時,不光需要將mode的值改爲StateServer,還需要在stateConnectionString中配置相應的參數。例如你的計算你是192.168.0.1,你想把Session存儲在IP192.168.0.2的計算機的進程中,就需要設置成這樣: stateConnectionString="tcpip=192.168.0.2:42424"。當然,不要忘記在192.168.0.2的計算機中裝上.NET Framework,並且啓動ASP.NET State Services服務。

 

 

 

將服務器Session信息存儲在SQL Server

  首先,還是讓我們來做一些準備工作。啓動SQL ServerSQL Server代理服務。在SQL Server中執行一個叫做 InstallSqlState.sql的腳本文件。這個腳本文件將在SQL Server中創建一個用來專門存儲Session信息的數據庫,及一個維護Session信息數據庫的SQL Server代理作業。我們可以在以下路徑中找到那個文件:

[system drive]/winnt/Microsoft.NET/Framework/[version]/

  然後打開查詢分析器,連接到SQL Server服務器,打開剛纔的那個文件並且執行。稍等片刻,數據庫及作業就建立好了。這時,你可以打開企業管理器,看到新增了一個叫ASPState的數據庫。但是這個數據庫中只是些存儲過程,沒有用戶表。實際上Session信息是存儲在了tempdb 數據庫的ASPStateTempSessions表中的,另外一個ASPStateTempApplications表存儲了ASP Application對象信息。這兩個表也是剛纔的那個腳本建立的。另外查看管理->SQL Server代理->作業,發現也多了一個叫做ASPState_Job_DeleteExpiredSessions的作業,這個作業實際上就是每分鐘去ASPStateTempSessions 表中刪除過期的Session信息的。

  接着,我們返回到Web.config文件,修改mode的值改爲SQLServer。注意,還要同時修改sqlConnectionString的值,格式爲:

sqlConnectionString="data source=localhost; Integrated Security=SSPI;"

  其中data source是指SQL Server服務器的IP地址,如果SQL ServerIIS是一臺機子,寫127.0.0.1 就行了。Integrated Security=SSPI的意思是使用Windows集成身份驗證,這樣,訪問數據庫將以ASP.NET的身份進行,通過如此配置,能夠獲得比使用userid=sa;password=口令的SQL Server驗證方式更好的安全性。當然,如果SQL Server運行於另一臺計算機上,你可能會需要通過Active Directory域的方式來維護兩邊驗證的一致性。

  同樣,讓我們做個試驗。向SessionState.aspx中添加Session信息,這時發現Session信息已經存在 SQL Server中了,即使你重起計算機,剛纔的Session信息也不會丟失。現在,你已經完全看見了Session信息到底是什麼樣子的了,而且又是存儲在SQL Server中的,能幹什麼就看你的發揮了。

 

總結

  通過這篇文章,你可以看到在Session的管理和維護上,ASP.NETASP有了很大的進步,我們可以更加隨意的挑選適合的方法了。對於企業級的應用來說,這無疑對於服務器的同步、服務器的穩定性、可靠性都是有利的。相信在強大的微軟支持下,新一代的電子商務平臺將會搭建的更好!

        同時,大家也會發現,在這個整個技術中包括了操作系統、Web服務及數據庫多種技術的整合。我相信,也許Windows沒有Unix穩定, IIS沒有Apache穩定,SQL Server也沒有Oracle強大,但是,誰可以將他們如此完美的聯動到一起呢?所以說,雖然微軟每一方面都不是太強,但是如果把微軟的東西都整合到一起,誰敢說他不強大呢?微軟就是微軟!

 

 

 

三、Asp.net 關於form認證的一般設置

asp.net 關於form認證的一般設置:

1: web.config中,加入form認證;

   <authentication mode="Forms">

            <forms name="auth" loginUrl="index.aspx" timeout="30"></forms>

</authentication>

<authorization>

        <deny users="?" />

</authorization>

2: 如果有註冊頁面時還應該允許匿名用戶調用註冊頁面進行註冊;

以下代碼應該在<configuration><system.web>之間,而不應該包含到<system.web>..</system.web>之間;

----------------表示允許 匿名用戶對 userReg.aspx頁面進行訪問.

<location path="userReg.aspx">

  <system.web>

     <authorization>

         <allow users="?" />

     </authorization>

  </system.web>

</location>

3 在登錄成功後要創建身份驗證票, 表明已經通過認證的合法用戶;

if(登陸成功)

 

System.Web.Security.FormsAuthentication.SetAuthCookie(用戶名稱, false);

  四、訪問Web.config文件

  你可以通過使用ConfigurationSettings.AppSettings 靜態字符串集合來訪問 Web.config 文件示例:獲取上面例子中建立的連接字符串。例如:

 

protected static string Isdebug = ConfigurationSettings.AppSettings["scon"]

 

該文章轉自Doorle's Blog-多樂博客:http://www.doorle.cn/blog/article/923.htm

發佈了9 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章