獲取 ASP.NET 提供的當前 Session 對象 ( HttpSessionState 類 )。該屬性提供有關當前請求的會話的信息。爲從 ASP.NET 應用程序請求頁或文檔的每一個用戶維護一個 Session 對象。當用戶在應用程序中從一頁移動到另外一頁時,存儲在 Session 對象中的變量不會被放棄;相反,只要用戶在應用程序中訪問頁,這些變量就將保持。 程序員
1、ASP.NET 會話狀態概述 web
可以使用 ASP.NET 會話狀態存儲和檢索用戶的值。 sql
當用戶在 Web 應用程序中導航 ASP.NET 頁時,ASP.NET 會話狀態使您可以存儲和檢索用戶的值。HTTP 是一種無狀態協議。這意味着 Web 服務器會將針對頁面的每一個 HTTP 請求做爲獨立的請求進行處理。服務器不會保留之前的請求過程當中所使用的變量值的任何信息。ASP.NET 會話狀態未來自限定時間範圍內的同一瀏覽器的請求標識爲一個會話,並提供用於在該會話持續期間內保留變量值的方法。默認狀況下,將爲全部 ASP.NET 應用程序啓用 ASP.NET 會話狀態。 數據庫
1、會話狀態的替代項包括: 數組
應用程序狀態,存儲 ASP.NET 應用程序的全部用戶可訪問的變量。 瀏覽器
配置文件屬性,將用戶值保留在數據存儲區中,使它們不會過時。 緩存
ASP.NET 緩存,將值存儲在全部 ASP.NET 應用程序可用的內存中。 安全
視圖狀態,將值保留在頁面中。 服務器
Cookie。 cookie
可經過 HTML 請求訪問的 HTTP 窗體上的查詢字符串和字段。
2、會話變量
在 ASP.NET 頁中,當前會話變量將經過 Page 對象的 Session 屬性公開。
會話變量集合按變量名稱或整數索引來進行索引。可經過按照名稱引用會話變量來建立會話變量,而無需聲明會話變量或將會話變量顯式添加到集合中。下面的示例演示如何在 ASP.NET 頁上建立分別表示用戶的名字和姓氏的會話變量,並將它們設置爲從 TextBox 控件檢索到的值。
Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;
會話變量能夠是任何有效的 .NET Framework 類型。下面的示例將 ArrayList 對象存儲在名爲 StockPicks 的會話變量中。當從 SessionStateItemCollection 檢索由StockPicks 會話變量返回的值時,必須將此值強制轉換爲適當的類型。
// When retrieving an object from session state, cast it to
// the appropriate type.
ArrayList stockPicks = (ArrayList)Session["StockPicks"];
// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;
3、會話標識符
會話由一個惟一標識符標識,可以使用 SessionID 屬性讀取此標識符。爲 ASP.NET應用程序啓用會話狀態時,將檢查應用程序中每一個頁面請求是否有瀏覽器發送的SessionID 值。若是未提供任何 SessionID 值,則 ASP.NET 將啓動一個新會話,並將該會話的 SessionID 值隨響應一塊兒發送到瀏覽器。
默認狀況下,SessionID 值存儲在 Cookie 中。但也能夠將應用程序配置爲在「無Cookie」會話的 URL 中存儲 SessionID 值。
只要一直使用相同的 SessionID 值來發送請求,會話就被視爲活動的。若是特定會話的請求間隔超過指定的超時值(以分鐘爲單位),則該會話被視爲已過時。使用過時的 SessionID 值發送的請求將生成一個新的會話。
安全說明:不管是做爲 Cookie 仍是做爲 URL 的一部分,P:System.Web.SessionState.HttpSessionState.SessionID 值都以明文的形式發送。惡意用戶經過獲取 SessionID 值並將其包含在對服務器的請求中,能夠訪問另外一位用戶的會話。若是您將敏感信息存儲在會話狀態中,建議使用 SSL 來加密瀏覽器和服務器之間包含 SessionID 值的任何通訊。
4、無 Cookie SessionID
默認狀況下,SessionID 值存儲在瀏覽器的不過時會話 Cookie 中。可是,經過在Web.config 文件的 sessionState 節中將 cookieless 屬性設置爲 true,能夠指定不該將會話標識符存儲在 Cookie 中。
下面的示例演示一個 Web.config 文件,它將 ASP.NET 應用程序配置爲使用無Cookie 會話標識符。
<configuration>
<system.web>
<sessionState cookieless="true"
regenerateExpiredSessionId="true" />
</system.web>
</configuration>
ASP.NET 經過自動在頁的 URL 中插入惟一的會話 ID 來保持無 Cookie 會話狀態。例如,下面的 URL 已被 ASP.NET 修改,以包含惟一的會話 ID lit3py55t21z5v55vlm25s55:
http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx
當 ASP.NET 向瀏覽器發送頁時,ASP.NET 將修改頁中任何使用相對於應用程序的路徑的連接,在連接中嵌入一個會話 ID 值。(不修改具備絕對路徑的連接。)只要用戶單擊已按這種方式修改的連接,便可保持會話狀態。可是,若是客戶端從新寫入應用程序提供的 URL,ASP.NET 將不能解析此會話 ID,也不能將請求與現有的會話相關聯。在這種狀況下,將爲請求啓動一個新的會話。
會話 ID 嵌入在 URL 中應用程序名稱後的斜槓以後,在其他全部文件或虛擬目錄標識符以前。這使 ASP.NET 能夠在使用請求中的 SessionStateModule 以前解析應用程序的名稱。
說明:爲提升應用程序的安全性,您應當容許用戶從應用程序註銷,此時應用程序應當調用 Abandon 方法。這下降了惡意用戶獲取 URL 中的惟一標識符並用它檢索存儲在會話中的用戶私人數據的風險。
5、從新生成已過時的會話標識符
默認狀況下,將回收無 Cookie 會話中使用的會話 ID 值。也就是說,若是使用已過時的會話 ID 發起一個請求,將使用該請求提供的 SessionID 值啓動一個新的會話。當包含無 Cookie SessionID 值的連接由多個瀏覽器使用時,這會致使無心中共享會話。(若是經過搜索引擎、電子郵件或另外一個程序傳遞連接,則會發生這種狀況。)能夠經過將應用程序配置爲不回收會話標識符來減小共享會話數據的機會。爲此,將 sessionState 配置元素的 regenerateExpiredSessionId 屬性設置爲 true。這將在使用已過時的會話 ID 發起無 Cookie 會話請求時,生成一個新的會話 ID。
說明:若是經過使用 HTTP POST 方法發起已使用已過時會話 ID 發起的請求,則當 regenerateExpiredSessionId 爲 true 時,將丟失發送的全部數據。這是由於ASP.NET 會執行重定向,以確保瀏覽器在 URL 中具備新的會話標識符。
6、自定義會話標識符
能夠實現自定義類來提供和驗證 SessionID 值。爲此,請建立一個從SessionIDManager 類繼承的類,並用您本身的實現來重寫 CreateSessionID 和 Validate方法。
能夠經過建立實現 ISessionIDManager 接口的類來替換 SessionIDManager 類。例如,經過使用 ISAPI 篩選器,Web 應用程序可能將惟一標識符與非 ASP.NET 頁(如 HTML 頁或圖像)相關聯。能夠實現自定義的 SessionIDManager 類,將此惟一標識符用於 ASP.NET 會話狀態。若是您的自定義類支持無 Cookie 會話標識符,則必須實現一個解決方案以便在 URL 中發送和檢索會話標識符。
7、會話模式
ASP.NET 會話狀態支持會話變量的一些存儲選項。每一個選項都被標識爲一個會話狀態 Mode 類型。默認行爲是將會話變量存儲在 ASP.NET 輔助進程的內存空間中。不過,也能夠指定是應將會話狀態存儲在單獨進程、SQL Server 數據庫仍是自定義數據源中。若是不但願爲應用程序啓用會話狀態,能夠將會話模式設置爲Off。
8、會話事件
ASP.NET 提供兩個可幫助您管理用戶會話的事件:Session_OnStart 事件和Session_OnEnd 事件。前者在開始一個新會話時引起;然後者在一個會話被放棄或過時時引起。會話事件是在 ASP.NET 應用程序的 Global.asax 文件中指定的。
若是將會話 Mode 屬性設置爲 InProc(默認模式)之外的值,則不支持Session_OnEnd 事件。
說明:若是 ASP.NET 應用程序的 Global.asax 文件或 Web.config 文件被修改,將從新啓動應用程序,並且存儲在應用程序狀態或會話狀態中的全部值都將丟失。注意,某些防病毒軟件可能會更新應用程序的 Global.asax 或 Web.config 文件的最後修改日期和時間。
9、配置會話狀態
經過使用 system.web 配置節的 sessionState 元素可配置會話狀態。還能夠經過使用 @ Page 指令中的 EnableSessionState 值來配置會話狀態。
使用 sessionState 元素可指定如下選項:
·會話存儲數據所使用的模式。
·在客戶端和服務器間發送會話標識符值的方式。
·會話的 Timeout 值。
·支持基於會話 Mode 設置的值。
下面的示例演示一個 sessionState 元素,該元素將配置應用程序的 SQLServer 會話模式。該元素將 Timeout 值設置爲 30 分鐘,並指定將會話標識符存儲在 URL 中。
<sessionState mode="SQLServer"
cookieless="true "
regenerateExpiredSessionId="true "
timeout="30"
sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
stateNetworkTimeout="30"/>
能夠經過將會話狀態模式設置爲 Off 來禁用應用程序的會話狀態。若是隻但願禁用應用程序的某個特定頁的會話狀態,則能夠將 @ Page 指令中的 EnableSessionState值設置爲 false。還可將 EnableSessionState 值設置爲 ReadOnly 以提供對會話變量的只讀訪問。
10、併發請求和會話狀態
對 ASP.NET 會話狀態的訪問專屬於每一個會話,這意味着若是兩個不一樣的用戶同時發送請求,則會同時授予對每一個單獨會話的訪問。可是,若是這兩個併發請求是針對同一會話的(經過使用相同的 SessionID 值),則第一個請求將得到對會話信息的獨佔訪問權。第二個請求將只在第一個請求完成以後執行。(若是因爲第一個請求超過了鎖定超時時間而致使對會話信息的獨佔鎖定被釋放,則第二個會話也可得到訪問權。)若是將 @ Page 指令中的 EnableSessionState 值設置爲 ReadOnly,則對只讀會話信息的請求不會致使對會話數據的獨佔鎖定。可是,對會話數據的只讀請求可能仍需等到解除由會話數據的讀寫請求設置的鎖定。
11、如何:保存會話狀態中的值
此示例使用 HttpSessionState 對象持久保留單個會話中的值。
string firstName = "Jeff";
string lastName = "Smith";
string city = "Seattle";
Session["FirstName"] = firstName;
Session["LastName"] = lastName;
Session["City"] = city;
會話狀態可能會過時(默認狀況下,在處於不活動狀態 20 分鐘後過時),而在其中存儲的信息可能會丟失。可使用 sessionState 配置節的 timeout 屬性控制會話狀態生存期。
根據您的應用程序的要求,您可能要考慮採用會話狀態的替代方法來存儲每一個用戶的信息。ASP.NET 提供了用於在應用程序內持久保留數據的其餘幾種選擇。
12、如何:讀取會話狀態中的值
此示例訪問 Item 屬性來檢索會話狀態中的值。
string firstName = (string)(Session["First"]);
string lastName = (string)(Session["Last"]);
string city = (string)(Session["City"]);
若是嘗試從不存在的會話狀態中獲取值,則不會引起任何異常。若要確保所需的值在會話狀態中,請首先使用測試(例如如下測試)檢查該對象是否存在:
if (Session["City"] == null)
// No such value in session state; take appropriate action.
若是您嘗試經過某些其餘方法(例如,檢查其類型)使用不存在的會話狀態項,就會引起 NullReferenceException 異常。
會話值的類型爲 Object。在 Visual Basic 中,若是設置 Option Strict On,則從會話狀態中獲取值時必須將類型 Object 強制轉換爲適當的類型,如示例中所示。在C# 中,在讀取會話值時必須老是強制轉換爲適當的類型。
13、實現會話狀態存儲提供程序
描述自定義會話狀態存儲提供程序實現,並演示示例提供程序實現。
使用 ASP.NET 會話狀態能夠將用戶會話數據存儲在不一樣的源中。默認狀況下,會話狀態值和信息都存儲在 ASP.NET 進程的內存中。一個方法是將會話數據存儲在狀態服務器中,狀態服務器將會話數據保存在單獨的進程中,若是 ASP.NET 應用程序關閉再從新啓動,則它會保留會話數據。另外一個方法是將會話數據存儲在 SQL Server 數據庫中,這種狀況下會話數據可由多個 Web 服務器共享。
可使用 ASP.NET 附帶的會話狀態存儲,也能夠實現本身的會話狀態存儲提供程序。因爲下列緣由,您能夠建立自定義會話狀態存儲提供程序:
須要將會話狀態信息存儲在 SQL Server 之外的數據源中,如 FoxPro 數據庫或Oracle 數據庫。
須要使用不一樣於 .NET Framework 附帶的提供程序所使用的數據庫架構來管理會話狀態信息。例如,使用預約義架構存儲在現有 SQL Server 數據庫中的購物車數據。
能夠經過建立一個繼承 SessionStateStoreProviderBase 類的類,來實現自定義會話狀態存儲提供程序。
2、HttpSessionState 類
提供對會話狀態值以及會話級別設置和生存期管理方法的訪問。
ASP.NET 提供了會話狀態管理,使您能夠根據多種請求存儲與惟一瀏覽器會話相關聯的信息。您能夠存儲由鍵名或數字索引引用的值的集合。您可使用HttpSessionState 類訪問會話值和功能,該類可經過當前 HttpContext 的 Session 屬性或 Page 的 Session 屬性進行訪問。
會話數據經過惟一標識符與特定瀏覽器會話相互關聯。默認條件下,該標識符存儲在瀏覽器的不過時會話 Cookie 中,可是您也能夠在應用程序配置的 sessionState元素中,將 cookieless 屬性設置爲 true 或 UseUri,以此方法配置應用程序,將會話標識符存儲在 URL 中。您能夠經過指定 cookieless 屬性的 UseDeviceProfile 值,讓ASP.NET 肯定瀏覽器是否支持 Cookie。您也能夠爲 cookieless 屬性指定 AutoDetect值,讓 ASP.NET 肯定是否爲瀏覽器啓用 Cookie。若是指定 UseDeviceProfile 後瀏覽器支持 Cookie,或指定 AutoDetect 後瀏覽器啓用了 Cookie,則會話標識符將存儲在Cookie 中;不然它將存儲在 URL 中。
第一次請求過程當中會話將會啓動,而且在達到 Timeout 屬性中指定的分鐘數以前若是瀏覽器未發送新的請求,當前的會話值將持續有效。新會話開始後將引起會話Start 事件。會話啓動時您可使用此事件執行任何其餘工做,例如設置默認會話值。若是會話超時,將調用 Abandon 方法,或者關閉 ASP.NET 應用程序,此時將引起會話 End 事件。您可使用此事件執行任何須要的清理操做。僅當會話狀態mode 被設置爲 InProc 時,才引起 End 事件。
若要提升性能,只有數據確實存儲在 Session 對象中後,使用 Cookie 的會話纔會分配會話存儲。
會話狀態的持續性不會跨越 ASP.NET 應用程序的邊界。若是瀏覽器定位到另外一應用程序,則當前的會話信息對新應用程序再也不有效。
默認條件下,會話值存儲在 Web 服務器的內存中。您也能夠把會話值存儲在SQL Server 數據庫、ASP.NET 狀態服務器或自定義服務器中。一旦 ASP.NET 或 IIS進程或 ASP.NET 應用程序從新啓動,這種舉措能夠保存會話值,而且它還可使會話值在網絡場的全部服務器間可用。要配置這種行爲,請在應用程序配置的sessionState 元素中把 mode 屬性設置爲有效的 SessionStateMode 值。
會話狀態的替代項包括應用程序狀態(請參見 Application 屬性)和 ASP.NET 緩存(請參見 System.Web.Caching 命名空間),它們存儲可由 ASP.NET 應用程序的全部用戶訪問的變量;ASP.NET 配置文件(請參見 System.Web.Profile 命名空間),它將用戶值保持在數據存儲區中,而不使用超時功能設置到期時間;ASP.NET System.Web.UI.WebControls,它將控件的值保持在 ViewState中;Cookies;QueryString 屬性;HTML 窗體上的字段,可以使用 Form 集合經過HTTP POST 使用這些字段。
3、HttpSessionState 類成員
方法
說明 |
|
取消當前會話。 |
|
向會話狀態集合添加一個新項。 |
|
從會話狀態集合中移除全部的鍵和值。 |
|
將會話狀態值的集合複製到一維數組中(從數組的指定索引處開始)。 |
|
返回一個枚舉數,可用來讀取當前會話中全部會話狀態的變量名稱。 |
|
用做特定類型的哈希函數。 (繼承自 Object。) |
|
刪除會話狀態集合中的項。 |
|
從會話狀態集合中移除全部的鍵和值。 |
|
刪除會話狀態集合中指定索引處的項。 |
|
擴展方法
說明 |
|
將 IEnumerable 轉換爲 IQueryable。 (由 Queryable 定義。) |
|
將 IEnumerable 的元素轉換爲指定的類型。 (由 Enumerable 定義。) |
|
根據指定類型篩選 IEnumerable 的元素。 (由 Enumerable 定義。) |
屬性
說明 |
|
獲取或設置當前會話的字符集標識符。 |
|
獲取對當前會話狀態對象的引用。 |
|
獲取一個值,該值指示是否爲無 Cookie 會話配置應用程序。 |
|
獲取會話狀態集合中的項數。 |
|
獲取一個值,該值指示會話 ID 是嵌入在 URL 中仍是存儲在 HTTP Cookie 中。 |
|
獲取一個值,該值指示會話是不是與當前請求一塊兒建立的。 |
|
獲取一個值,該值指示會話是否爲只讀。 |
|
獲取一個值,該值指示對會話狀態值的集合的訪問是不是同步(線程安全)的。 |
|
已重載。 獲取或設置個別會話值。 |
|
獲取存儲在會話狀態集合中全部值的鍵的集合。 |
|
獲取或設置當前會話的區域設置標識符 (LCID)。 |
|
獲取當前會話狀態模式。 |
|
獲取會話的惟一標識符。 |
|
獲取由 ASP.NET 應用程序文件 Global.asax 中的 <object Runat="Server" Scope="Session"/> 標記聲明的對象的集合。 |
|
獲取一個對象,該對象可用於同步對會話狀態值的集合的訪問。 |
|
獲取並設置在會話狀態提供程序終止會話以前各請求之間所容許的時間(以分鐘爲單位)。 |
4、Session應用
1、Session模型簡介
Session是什麼呢?簡單來講就是服務器給客戶端的一個編號。當一臺WWW服務器運行時,可能有若干個用戶瀏覽正在運正在這臺服務器上的網站。當每一個用戶首次與這臺WWW服務器創建鏈接時,他就與這個服務器創建了一個Session,同時服務器會自動爲其分配一個SessionID,用以標識這個用戶的惟一身份。這個SessionID是由WWW服務器隨機產生的一個由24個字符組成的字符串,咱們會在下面的實驗中見到它的實際樣子。
這個惟一的SessionID是有很大的實際意義的。當一個用戶提交了表單時,瀏覽器會將用戶的SessionID自動附加在HTTP頭信息中,(這是瀏覽器的自動功能,用戶不會察覺到),當服務器處理完這個表單後,將結果返回給SessionID所對應的用戶。試想,若是沒有SessionID,當有兩個用戶同時進行註冊時,服務器怎樣才能知道究竟是哪一個用戶提交了哪一個表單呢。固然,SessionID還有不少其餘的做用,咱們會在後面說起到。
除了SessionID,在每一個Session中還包含不少其餘信息。可是對於編寫ASP或ASP.NET的程序與來講,最有用的仍是能夠經過訪問ASP/ASP.NET的內置Session對象,爲每一個用戶存儲各自的信息。例如咱們想了解一下訪問咱們網站的用戶瀏覽了幾個頁面,咱們可能在用戶可能訪問到每一個的頁面中加入:
<%
If Session("PageViewed") = ""Then
Session("PageViewed") = 1
Else
Session("PageViewed") = Session("PageViewed") + 1
End If
%>
經過如下這句話可讓用戶得知本身瀏覽了幾個頁面:
<%
Response.Write("You have viewed " & Session("PageViewed") & " pages")
%>
可能有些有些讀者會問:這個看似像是數組的Session(「..」)是哪裏來的?須要我定義嗎?實際上,這個Session對象是具備ASP解釋能力的的WWW服務器的內建對象。也就是說ASP的系統中已經給你定義好了這個對象,你只須要使用就好了。其中Session(「..」)中的..就好像變量名稱,Session(「..」)=$$中的$$就是變量的值了。你只須要寫上句話,在這個用戶的每一個頁面中均可以訪問..變量中的值了。
其實ASP一共內建了7個對象,有Session、Application、Cookie、Response、Request、Server等。在其餘的服務器端腳本語言如JSP、PHP等中也有其相似的對象,只是叫法或者使用方法上不太同樣。
ASP Session的功能的缺陷
目前ASP的開發人員都正在使用Session這一強大的功能,可是在他們使用的過程當中卻發現了ASP Session有如下缺陷:
進程依賴性:ASP Session狀態存於IIS的進程中,也就是inetinfo.exe這個程序。因此當inetinfo.exe進程崩潰時,這些信息也就丟失。另外,重起或者關閉IIS服務都會形成信息的丟失。
Session狀態使用範圍的侷限性:剛一個用戶從一個網站訪問到另一個網站時,這些Session信息並不會隨之遷移過去。例如:新浪網站的WWW服務器可能不止一個,一個用戶登陸以後要去各個頻道瀏覽,可是每一個頻道都在不一樣的服務器上,若是想在這些WWW服務器共享Session信息怎麼辦呢?
Cookie的依賴性:實際上客戶端的Session信息是存儲與Cookie中的,若是客戶端徹底禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
鑑於ASP Session的以上缺陷,微軟的設計者們在設計開發 ASP.NET Session時進行了相應的改進,徹底克服了以上缺陷,使得ASP.NET Session成爲了一個更增強大的功能。
Web.config文件簡介
有的ASP.NET程序員說:Web.config文件?我歷來沒有據說過啊,但是我寫的程序不是也能很正常的運轉嗎?是的,你說得沒錯,沒有Web.config文件程序是能夠正常運行的。可是,若是你作了一個大型的網站,須要對整個網站作一些總體配置,例如整個網站的頁面使用何種語言編寫的、網站的安全認證模式、Session信息存儲方式等,這時你就須要使用Web.config文件了。雖然Web.config文件中的某些選項是能夠經過IIS配置的,可是若是在Web.config中也有相應的設置就會覆蓋掉IIS中的配置。並且,Web.config文件的最大的便利之處就是能夠在ASP.NET頁面中經過調用System.web名字空間訪問Web.config中的設置。
Web.config有兩種,分別是服務器配置文件和Web應用程序配置文件,他們都名爲Web.config。在這個配置文件中會保存當前IIS服務器中網頁的使用哪一種語言編寫的、應用程序安全認證模式、Session信息存儲方式的一系列信息。這些信息是使用XML語法保存的,若是想對其編輯,使用文本編輯器就好了。
其中服務器配置文件會對IIS服務器下全部的站點中的全部應用程序起做用。在.NET Framework 1.0中,服務器的Web.config文件是存在:/WinNT/Microsoft.NET/Framework/v1.0.3705中的。
而Web應用程序配置文件Web.config則保存在各個Web應用程序中。例如:當前網站的根目錄/Inetpub/wwwroot,而當前的Web應用程序爲MyApplication,則Web應用程序根目錄就應爲:/Inetpub/wwwroot/MyApplication。若是你的網站有且只有一個Web應用程序,通常說來應用程序的根目錄就是/Inetpub/wwwroot。若是想添加一個Web應用程序,在IIS中添加一個具備應用程序起始點的虛擬目錄就好了。這個目錄下的文件及目錄將被視爲一個Web應用程序。可是,這樣經過IIS添加Web應用程序是不會爲你生成Web.config文件的。若是想建立一個帶有Web.config文件的Web應用程序,須要使用Visual Studio.NET,新建一個Web應用程序項目。
Web應用程序的配置文件Web.config是可選的,無關緊要。若是沒有,每一個Web應用程序會使用服務器的Web.config配置文件。若是有,則會覆蓋服務器Web.config配置文件中相應的值。
在ASP.NET中,Web.config修改保存後會自動馬上成效,不用再像ASP中的配置文件修改後須要從新啓動Web應用程序才能生效了。
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信息存儲方式分爲:Cookie和Cookieless兩種。
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存儲在IP爲192.168.0.2的計算機的進程中,就須要設置成這樣:stateConnectionString="tcpip=192.168.0.2:42424"。固然,不要忘記在192.168.0.2的計算機中裝上.NET Framework,而且啓動ASP.NET State Services服務。
將服務器Session信息存儲在SQL Server中
首先,仍是讓咱們來作一些準備工做。啓動SQL Server和SQL 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 Server與IIS是一臺機子,寫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.NET比ASP有了很大的進步,咱們能夠更加隨意的挑選適合的方法了。對於企業級的應用來講,這無疑對於服務器的同步、服務器的穩定性、可靠性都是有利的。相信在強大的微軟支持下,新一代的電子商務平臺將會搭建的更好!