web.config中的session配置詳解

yszwn發表於2009-12-18

     開啟某個應用程式的配置檔案Web.config後,我們會發現以下這段: 

   

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

  

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

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秒鐘。

這個SessionState.aspx的頁面可以用來測試在當前的伺服器上是否丟失了session資訊。

將伺服器session資訊儲存在程式中

讓我們來回到Web.config檔案的剛才那段段落中:

 

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

這種方式和以前asp中的模式一樣,就是伺服器將session資訊儲存在IIS程式中。當IIS關閉、重起後,這些資訊都會丟失。但是這種模式也有自己最大好處,就是效能最高。應為所有的session資訊都儲存在了IIS的程式中,所以IIS能夠很快的訪問到這些資訊,這種模式的效能比程式外儲存session資訊或是在sql server中儲存session資訊都要快上很多。這種模式也是asp.NET的預設方式。

好了,現在讓我們做個試驗。開啟剛才的SessionState.aspx頁面,隨便輸入一些字元,使其儲存在session中。然後,讓我們讓IIS重起。注意,並不是使當前的站點停止再開始,而是在IIS中本機的機器名的節點上點選滑鼠右鍵,選擇重新啟動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中的,能幹什麼就看你的發揮了。 

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檔案,找到如下段落:

 

這段話中的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>中。 

這個SessionState.aspx的頁面可以用來測試在當前的伺服器上是否丟失了session資訊。

將伺服器session資訊儲存在程式中

讓我們來回到Web.config檔案的剛才那段段落中:

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

這種方式和以前asp中的模式一樣,就是伺服器將session資訊儲存在IIS程式中。當IIS關閉、重起後,這些資訊都會丟失。但是這種模式也有自己最大好處,就是效能最高。應為所有的session資訊都儲存在了IIS的程式中,所以IIS能夠很快的訪問到這些資訊,這種模式的效能比程式外儲存session資訊或是在sql server中儲存session資訊都要快上很多。這種模式也是asp.NET的預設方式。

好了,現在讓我們做個試驗。開啟剛才的SessionState.aspx頁面,隨便輸入一些字元,使其儲存在session中。然後,讓我們讓IIS重起。注意,並不是使當前的站點停止再開始,而是在IIS中本機的機器名的節點上點選滑鼠右鍵,選擇重新啟動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中的,能幹什麼就看你的發揮了。

相關文章