Asp.Net保存session的三種方法 (Dll文件更新導致session丟失的解決辦法)


1. InProc模式(默認值):asp.net將session保存到當前進程中,這種方式最快,但是不能多台服務器共享session,且會話狀態數據容易丟失。

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

注意:使用進程內會話狀態模式時,如果 aspnet_wp.exe 或應用程序域重新啟動,則會話狀態數據將丟失。
這些重新啟動通常會在下面的情況中發生:
1、配置文件中processModel標簽的memoryLimit屬性
2、Global.asax或者Web.config文件被更改
3、Bin文件夾中的Web程序(DLL)被修改
4、殺毒軟件掃描了一些.config文件。

2. StateServer模式:保存session到獨立windows進程,要使用這種方法,需要打開aspnet_state.exe服務,通過此方法,我們可以將session保存到其它服務器,這樣可以實現多台服務器的session共享,且會話狀態數據比較穩定,除非電腦重啟或者StateService服務崩掉,否則Session是不會丟的(因Session超時被丟棄是正常的)。

<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42626" cookieless="false" timeout="20" />

注意:
  1. StateServer是本機的一個服務,可以在系統服務里看到服務名為ASP.NET State Service的服務,默認情況是不啟動的。當我們設定mode為StateServer之后,請手工將該服務啟動。
    
  2. 在使用StateServer或者SQLServer存儲Session時,所有需要保存到Session的對象除了基本數據類型(默認的數據類型,如int、string等)外,都必須序列化。只需將[Serializable]標簽放到要序列化的類前就可以了。
    如:
    [Serializable]
    public class MyClass
    {
      ......
    }

3. SQLServer模式:保存session到SQL Server數據庫,需要指定SQLServer服務器,這種方法因為要讀寫數據庫,性能最低。優點是這種方法最穩定,即使服務器重啟了,會話數據也不會丟失。

<sessionState mode="SQLServer" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />

注意:首先要創建用於保存Session數據的數據庫,以命令行的形式用aspnet_regsql.exe來完成,具體命令為:
C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regsql.exe -ssadd -sstype c -d sessiondb -E
該命令是以windows驗證方式,添加了sessiondb數據庫保存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自動加上的,不會影響以前正常的連接。

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

文章引用來源:
http://mybloggers.blog.163.com/blog/static/100386509200951904716855/
http://www.51zixuewang.com/article/xingyejishu/jiaochengtianxia/2016/137183.html
http://blog.sina.com.cn/s/blog_531a52b50100bovg.html
http://www.cnblogs.com/webapi/p/5726763.html

版權聲明:本文采用署名-非商業性使用-相同方式共享(CC BY-NC-SA 3.0 CN)國際許可協議進行許可,轉載請注明作者及出處。
本文標題:Asp.Net保存session的三種方法 (Dll文件更新導致session丟失的解決辦法)
本文鏈接:http://www.cnblogs.com/sochishun/p/6952602.html
本文作者:SoChishun (郵箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
發表日期:2017年6月6日


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM