程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 小技巧-ASP.Net session保存在數據庫服務器,-asp.netsession

小技巧-ASP.Net session保存在數據庫服務器,-asp.netsession

編輯:關於.NET

小技巧-ASP.Net session保存在數據庫服務器,-asp.netsession


引用博客:http://www.cnblogs.com/lykbk/archive/2013/01/13/hf576856868.html

web Form 網頁是基於HTTP的,它們沒有狀態, 這意味著它們不知道所有的請求是否來自 同一台客戶端計算機,網頁是受到了破壞,以及是否得到了刷新,這樣就可能造成信息的 丟失。 於是, 狀態管理就成了開發網絡應用程序的一個實實在在的問題。     在ASP中能夠通過Cookie 、查詢字符串、 應用程序、會話(Session) 等輕易解決這些問題。 現在在ASP.NET環境中,我們依然可以使用這些功能,並且功能更加強大。 狀態管理分為服務端和客戶端兩種情況, 這裡只是介紹 服務端狀態管理:

   與Application對象不同的是, ASP.NET 的Session對象可以在IIS服務器或者工作進程重新啟動時 恢復啟動前的狀態而不丟失其中的數據。這是因為存儲在Session中的所以信息都缺省的存儲在 一個作為Windows服務運行的狀態服務器進程中。狀態可以被序列化並以二進制形式保存在內存中。 程序員可以懸著使用Microsoft Sql server數據庫來存儲數據。

狀態服務器服務和狀態信息可以和web應用程序一起存在於同一台服務器上,也可以保存到外部的 狀態服務器上。 為了指定如何存儲信息,程序員可以在web.config文件中編寫適當的配置。

ASP.NET會話狀態模塊在Web.config文件中<System.web>標記下的<Sessionstate>標記的mode屬性來決定 該屬性的四種可能的值: Off、 Inproc StateServer 和SQLserver。    1 Inproc是缺省的設置
它允許“無Cookie”的會話,以及在服務器之外存儲 會話數據。ASP.NET會話狀態模塊在Web.config文件中像下面這樣配置:

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

在這個例子中,mode屬性設為InProc(默認值),表明會話狀態要由ASP.NET存儲到內存中,而且 不用Cookie來傳遞會話ID。相反,會話ID要直接插入一個網頁URL的查詢字符串中。例如,采用 InProc模式並建立一個會話之後,調用一個假想的ASP.NET網頁時,需要采用下面這樣的URL:

http://my.website.com/(12mfju55vgblubjlwsi4dgjq)/education.aspx

圓括號中長長的字母、數字字符串就是會話ID。ASP.NET引擎從查詢字符中提取會話ID,並將用戶 請求與特定會話聯系起來。采取這種方式,不管Cookie還是隱藏表單字段都用不著了。 所以,即使網頁中沒有使用表單,也能加入會話。

但是這種方法,應用程序的狀態將依賴於 ASP.NET進程, 當IIS進程崩潰或者正常重啟時,保存在 進程中的狀態將丟失。

2 mode屬性設為Off
   和從前的ASP一樣,ASP.NET的會話狀態管理是要產生開銷的。所以,假如某個網頁不需要訪問 Session對象,開發者應將那個頁的Page預編譯指令的EnableSessionState屬性設為False。 要為整個網站禁用會話狀態,可在Web.config文件中將sessionState元素的mode屬性設為Off。

   為了克服inproc 模式的缺點, ASP.NET 提供了兩種進程外保存會話狀態的方法。

3 StateServer會話管理

將mode屬性設為StateServer,也就是將會話數據存儲到單獨的內存緩沖區中,再由單獨一台機器上運行

的Windows服務來控制這個緩沖區。狀態服務全稱是“ASP.NET State Service ”(aspnet_state.exe),

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

視的端口: <sessionState mode="StateServer"     stateConnectionString="tcpip=myserver:42424"     cookieless="false" timeout="20" />    在這個例子中,狀態服務在一台名為myserver的機器的42424端口(默認端口)運行。要在服務器上改變

端口,可編輯HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state注冊表項中的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文件夾中的InstallState.sql腳本(WinDir是服務

器的Windows文件夾,而Version是你使用的.NET框架版本的安裝文件夾)。 要配置SQL服務器,可以在命令行中運行SQL Server 提供的命令行工具osql.exe

osql -S [ server name] -U [user] -P [password] <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, 這樣就可以為應用程序提供極大限度的可靠性。

上面的Mode有錯誤,應該是SQLServer,StateServer,InProc,下面是實際應用列子。

在應用服務器用管理員方式運行CMD,執行SQL。

osql -S 192.168.1.1 -U sa -P 123456 -i C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallSqlState.sql

創建完後會在數據庫有個叫ASPState的數據庫,但是我沒有發現任何表,有視圖,不清楚這是什麼機制。

配置文件寫法。

<sessionState mode="SQLServer" sqlConnectionString="data source=192.168.1.1;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;" cookieless="false" timeout="111220" />

Framework3.5的類存Session需要用 [Serializable]標識為可序列化,否則報錯。4.0以後應該不需要,本人還沒有試驗過。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved