標籤:
1.由於項目dll檔案變動比較頻繁,而儲存登陸的狀態又儲存在Session中,所以導致使用者經常無故掉線。(dll變動的時候導致Session丟失)
2.有一種方法可以長期儲存session,那就是session的SqlServer模式。還是先介紹一下session的四種模式吧:
ASP.NET工作階段狀態模組在Web.config檔案中<System.web>標記下的<Sessionstate>標記的mode屬性來決定該屬性的四種可能的值: Off、 Inproc StateServer 和SQLserver。
①. 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進程崩潰或者正常重啟時,儲存在進程中的狀態將丟失。
②.mode屬性設為Off
和從前的ASP一樣,ASP.NET的工作階段狀態管理是要產生開銷的。所以,假如某個網頁不需要訪問Session對象,開發人員應將那個頁的Page先行編譯指令的EnableSessionState屬性設為False。要為整個網站禁用工作階段狀態,可在Web.config檔案中將sessionState元素的mode屬性設為Off。 為了克服inproc 模式的缺點, ASP.NET 提供了兩種進程外儲存工作階段狀態的方法(③和④)。
③.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那樣能持久儲存資料;它只是將資料存放區在記憶體中。
④.用SQL Server進行會話管理 (重點講解)
ASP.NET還允許將會話資料存放區到一個資料庫伺服器中,方法是將mode屬性變成SqlServer。 在這種情況下,ASP.NET嘗試將會話資料存放區到由sqlConnectionString屬性(其中包含資料來源以及登入伺服器所需的安全憑證)指定的SQL Server中。
3.配置用SQL Server進行會話管理
具體配置如下:
①、運行Framewor安裝目錄下的InstallSqlState.sql檔案,framework的安裝目錄為C:/WINDOWS/Microsoft.NET/Framework/... (例如:C:\Windows\Microsoft.NET\Framework\v4.0.30319)
②、這時會提示錯誤,因為該應用沒有註冊。此時需要在命令列下註冊該應用,運行如下命令:
aspnet_regsql.exe -ssadd -sstype c -d <Database Name> -S <SQL Server IP> -U <User Name> -P <Password>
註:<Database Name>為資料庫名為ASPState ,<SQL Server IP>為資料庫執行個體名像 IBM-PC\SQLEXPRESS (若資料庫不是2005的不要寫ip地址,否則會串連失敗),<User Name>為sa(或與sa同等許可權的),<Password> 為 sa使用者名稱的密碼
會話定義成功,但是會提示在web應用中進行相應的配置,此時查看SQLServer會發現增加了資料庫ASPState,但是沒有表。
③、在命令列下運行如下命令:
aspnet_regsql.exe -ssadd -sstype p -S <SQL Server IP> -U <User Name> -P <Password>
該命令對此應用進行了持久化操作。這時會看到ASPState資料庫裡面多了兩張表,ASPStateTempSession就可以用來儲存Session。
應用時,需要在webconfig中添加如下配置:
配置節點如下:
<sessionState mode="SQLServer" timeout="20" sqlConnectionString="server=127.0.0.1;uid=sa;pwd=1234;"></sessionState>
如下:
雖然timeout設定的是20分鐘但是 到期以後仍然可以擷取到session的值。
原文地址: http://blog.csdn.net/aiouwen521/article/details/17790681
Asp.Net將Session儲存在資料庫中