ASP.NET會話(Session)儲存模式__.net

來源:互聯網
上載者:User

出處:http://blog.csdn.net/cityhunter172/article/details/727743

  今日抽空就說一下 Session 在 .Net v1.0/v1.1 中的儲存模式。大家可在 MSDN 2003 中搜尋一下 < sessionState > 即可看到關於 Web.config 中的 < sessionState > 節點元素的描述,共有Off、InProc、StateServer、SQLServer四種模式。Off、InProc 分別指“不啟用”、“進程內儲存(預設值)”,此兩種模式沒啥講的,所謂 InProc 就是把 Session 儲存在aspnet_wp.exe (Windows 2000 解析 ASP.NET頁面所用的進程) 或w3wp.exe (Win2003 的進程) 中,一旦進程被中止或被重設,Session 將丟失。

一、        引發 Session 丟失的幾種原因

動過手寫代碼的人都知道,Session 丟失是比較常見的事。以下是本人這幾年所遇到的,能夠引發 Session 丟失的原因,不敢說是百分百,丟失機率還是特別高的。錯…,簡直可以說是“相…當…”高哇 ^_^"

1、    存放 Session 的電腦重啟(廢話,若這樣都不丟,你神仙啊)

2、    InProc 模式:aspnet_wp.exe或w3wp.exe 在“工作管理員”中或其它情況下導致其進程被終止運行。

3、    InProc 模式:修改 .cs 檔案後,編譯了兩次(只編譯一次,有時不會丟失)

4、    InProc 模式:修改了Web.config

5、    InProc 模式,Windows 2003 環境:應用程式集區回收、停止後重啟

6、    InProc 模式:伺服器上 bin 目錄裡的 .DLL 檔案被更新

以上列舉的都是 InProc 模式下,容易引發解析 ASP.NET 應用程式重設的原因。是不是覺得很窩火。之前我也有這種感覺,慢慢就習慣啦,再後來就乾脆不用這種模式了。於是乎,就有了使用下列兩種模式的嘗試,現寫出來與大家一起分享。

二、        使用 StateServer 儲存 Session

StateServer模式的實質是,把Session 存放在一個單獨的進程裡,此進程獨立於aspnet_wp.exe或w3wp.exe。啟用此服務後,在“工作管理員”中可以看到一個名為aspnet_state.exe的進程,下面開始說明一下設定的具體步驟:

 

1、    修改註冊表(關鍵步驟,如下圖)

運行regedit→開啟註冊表→找到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/aspnet_state/Parameters 節點→將AllowRemoteConnection 的索引值設定成“1”(1 為允許,0 代表禁止)→設定Port (連接埠號碼)

注意事項:

       a)、若ASP.NET State Service正在運行,修改註冊表內容後,則需要重新啟動該服務

b)、注意連接埠號碼的索引值是以十六進位儲存的,可以使用十進位進行修改,42424是預設的連接埠

c)、AllowRemoteConnection 的索引值設定成“1”後,意味著允許遠程電腦的串連,也就是說只要知道你的服務連接埠,就可享用你的ASP.NET State Service,即把 Session 存放在你的電腦進程內,因此請大家慎用;索引值為“0”時,僅有stateConnectionString為“tcpip=localhost: 42424”與“tcpip=127.0.0.1:42424”的情況,方可使用ASP.NET State Service

 

 

2、    開啟ASP.NET State Service(如下圖)

右鍵點擊“我的電腦”→管理→服務與應用程式→服務→雙擊“ASP.NET State Service”→啟動(可設為“自動”)

說明:只要安裝了 .Net Framework v1.0/v1.1 ,都擁有此服務。

 

 

3、    更改Web.config

開啟Web.config→找到<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"/>

 

→將其改為以下內容

<sessionStatemode="StateServer"  stateConnectionString="tcpip=192.168.0.2:42424"timeout="20"/>

注意事項:

       a)、設成StateServer 後,必須要有對應的stateConnectionString

       b)、注意 IP 位址(可以是遠端電腦 IP、電腦名稱、網域名稱)與連接埠號碼,連接埠號碼需與ASP.NET State Service的服務連接埠一致

 

三、        將 Session 放入 SQLServer 儲存

SQLServer模式就是,把Session 存放在SQL Server資料庫裡(注意不是Oracle,動動腳趾都能猜到原因啦),下面開始說明一下設定的具體步驟:

 

1、    啟動相關的資料庫服務(如圖)

運行SQL Server 服務管理器→啟動SQL Server(最好設為開機自動運行)→啟動SQL Server Agent服務(最好設為開機自動運行)

注意事項:

       a)、注意啟動順序,也可通過下列方式設定:右鍵點擊“我的電腦”→管理→服務與應用程式→服務→找到“MSSQLSERVER”與“SQLSERVERAGENT”→啟動並設定啟動類型為“自動”

b)、SQL Server Agent在此處的作用是清除資料庫中已到期的 Session

 

 

2、    建立存放 Session 的DataBase

運行“SQL 查詢分析器”→使用“sa”或是擁有“master”的db_owner許可權的使用者登入資料庫→開啟查詢檔案C:/WINNT/Microsoft.NET/Framework/v1.1.4322/InstallSqlState.sql(存放在 Windows 系統目錄的 .Net 安裝目錄下可找到)→直接運行該 sql 指令碼→重新整理資料庫即可看到名為ASPState的 DataBase

 

 

 

3、    建立串連資料庫ASPState的使用者,並為此使用者授權(此步驟可跳過)

進行此步的原因是:一是不想在Web.config中出現sa的密碼;二是tempdb在資料庫啟動後僅保留sa 一個帳號的使用許可權,其餘帳號的許可權統統被清除,但儲存 Session又需要用到此DataBase;

 

A)、運行 SQL Server 的企業管理器→展開資料庫的安全性→右擊“登入”→建立“登入”→輸入“名稱”→選擇“SQL Server 身分識別驗證”→輸入“密碼”→指定“資料庫”→點擊“資料庫訪問”→勾選“ASPState”→選中“db_owner”角色→點擊“確定”→再一次輸入“密碼”→點擊“確定”後即可建立ASPState的使用者(此處建立名為“SessionStateUser”,密碼為“123456”的測試使用者)

 

     

 

 

B)、運行 SQL Server 的企業管理器→展開“管理”→展開“SQL Server Agent”→右擊“作業”→點擊“新增作業”→輸入“名稱”(此例為

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.