Asp.Net Session学习总结
ASP.NET 中的 Session 怎么正確使用
https://www.cnblogs.com/ideacore/p/6423281.html
Session對(duì)象用于存儲(chǔ)從一個(gè)用戶開(kāi)始訪問(wèn)某個(gè)特定的aspx的頁(yè)面起,到用戶離開(kāi)為止,特定的用戶會(huì)話所需要的信息。用戶在應(yīng)用程序的頁(yè)面切換時(shí),Session對(duì)象的變量不會(huì)被清除。?
對(duì)于一個(gè)Web應(yīng)用程序而言,所有用戶訪問(wèn)到的Application對(duì)象的內(nèi)容是完全一樣的;而不同用戶會(huì)話訪問(wèn)到的Session對(duì)象的內(nèi)容則各不相同。 Session可以保存變量,該變量只能供一個(gè)用戶使用,也就是說(shuō),每一個(gè)網(wǎng)頁(yè)瀏覽者都有自己的Session對(duì)象變量,即Session對(duì)象具有唯一性。?
最近這兩天被一個(gè)Web Farm環(huán)境下的Session處理問(wèn)題虐得很痛苦,這是一個(gè)ASP.NETSession基礎(chǔ)知識(shí)的一個(gè)合集,有的地方感覺(jué)是有重復(fù),比較啰嗦,我基本上按照原文將他翻譯出來(lái)了,小弟程序水平不高,英語(yǔ)水平更差(09年高考英語(yǔ)65分,滿分150),自我感覺(jué)Session基礎(chǔ)內(nèi)容是講清楚了,我粗淺的理解下,沒(méi)有發(fā)現(xiàn)有什么錯(cuò)誤了,文章較淺,請(qǐng)各位發(fā)現(xiàn)有什么不對(duì)的地方告訴我,我一定盡快處理,這篇文章很適合初學(xué)者看,作者說(shuō)的很清楚,能把ASP.NET下Session的玩法看得較為清晰。另外我會(huì)在我另一篇博文中將我所遇到的問(wèn)題以及解決辦法和大家共享。原文地址:http://www.codeproject.com/Articles/32545/Exploring-Session-in-ASP-Net
這篇文章將使你非常好地理解Session,在這篇文章中,我會(huì)包含Session的基礎(chǔ)知識(shí),用不同的方式儲(chǔ)存Session對(duì)象,包含Web園(Web Farm)和Web農(nóng)場(chǎng)(Web Garden)以及負(fù)載均衡等等情境。我也將詳細(xì)闡明Session在實(shí)際生產(chǎn)環(huán)境中的應(yīng)用。希望您能喜歡這篇文章,歡迎您反饋您的看法和建議。
什么是Session
Web是無(wú)狀態(tài)的,他提供了一種新的方式:每次都通過(guò)用戶對(duì)服務(wù)器提交請(qǐng)求而渲染新的網(wǎng)頁(yè)。眾所周知,HTTP是一種無(wú)狀態(tài)協(xié)議,他不能通過(guò)頁(yè)面和客戶端保持連接。如果用戶需要增加一些信息和跳轉(zhuǎn)到了另外的頁(yè)面,原有的數(shù)據(jù)將會(huì)丟失,用戶將無(wú)法恢復(fù)這些信息。我們需要這玩意兒干嘛呢?我們需要保存信息!Session提供了一個(gè)在服務(wù)器端保存信息的方案。他能支持任何類型對(duì)象和用戶對(duì)象信息作為對(duì)象保存起來(lái)。Session為每一個(gè)客戶端都獨(dú)立地保存,這意味著Session數(shù)據(jù)存儲(chǔ)著每個(gè)客戶端的基礎(chǔ)信息。請(qǐng)看下圖:
每一個(gè)客戶端都有一份獨(dú)立的Session
用Session進(jìn)行狀態(tài)管理是ASP.NET最好的特性之一,因?yàn)樗前踩?#xff0c;對(duì)于客戶端是透明的,并且他能存儲(chǔ)任何類型的對(duì)象。而在這些優(yōu)點(diǎn)之外,有時(shí)Session會(huì)導(dǎo)致一些對(duì)性能要求較高的網(wǎng)站的性能問(wèn)題。因?yàn)樗姆?wù)器的內(nèi)存存儲(chǔ)用戶訪問(wèn)網(wǎng)站所需的數(shù)據(jù),現(xiàn)在讓我們來(lái)看一看Session對(duì)于您Web 應(yīng)用的利弊。
Session的利弊
接下來(lái)我們討論普通情況下使用Session的利弊,我會(huì)描述每一種Session的使用情境。
優(yōu)點(diǎn):
他能在整個(gè)應(yīng)用中幫助維護(hù)用戶狀態(tài)和數(shù)據(jù)。
他能讓我們簡(jiǎn)單地實(shí)現(xiàn)存儲(chǔ)任何類型的對(duì)象。
獨(dú)立地保存客戶端數(shù)據(jù)。
對(duì)于用戶來(lái)說(shuō),Session是安全的、透明的。
缺點(diǎn):
因?yàn)镾ession使用的是服務(wù)器的內(nèi)存,所以在用戶量大的時(shí)候會(huì)成為性能瓶頸。
在序列化和反序列化的過(guò)程中他也會(huì)成為性能瓶頸,因?yàn)樵赟tateServer(狀態(tài)服務(wù))模式和sql server模式下我們需要對(duì)我們存儲(chǔ)的數(shù)據(jù)進(jìn)行序列化和反序列化我們所存儲(chǔ)的數(shù)據(jù)。
除此之外,Session的各種模式都有其利弊。接下來(lái)我們將討論各種Session模式。
對(duì)Session進(jìn)行讀/寫
讀/寫Session是非常簡(jiǎn)單的,就像使用ViewState一樣,我們能使用System.Web.SessionState.HttPSessionState這個(gè)類來(lái)與Session進(jìn)行交互,這個(gè)類在ASP.NET頁(yè)面內(nèi)內(nèi)建(提供)了Session。下面的代碼就是使用Session進(jìn)行存儲(chǔ)的例子:
//Storing UserName in Session<br>Session["UserName"] = txtUser.Text;
接下來(lái)讓我們來(lái)看如何從Session讀取數(shù)據(jù):
//Check weather session variable null or not<br>if (Session["UserName"] != null)<br>{<br> //Retrieving UserName from Session
? ? lblWelcome.Text = "Welcome : " + Session["UserName"];<br>}else<br>{<br> //Do Something else<br>}
我們也能存儲(chǔ)其他對(duì)象,下面的例子展示了如何存儲(chǔ)一個(gè)DataSet到Session里
//Storing dataset on Session<br>Session["DataSet"] = _objDataSet;
下面的代碼展示了如何從Session內(nèi)讀取DataSet
//Check weather session variable null or not
if (Session["DataSet"] != null)
{
? ? //Retrieving UserName from Session
? ? DataSet _MyDs = (DataSet)Session["DataSet"];
}
else{
? ? //Do Something else
}
參考文獻(xiàn):
MSDN (read the session variable section)
Session ID
ASP.NET使用了120bit的標(biāo)識(shí)符用以標(biāo)識(shí)每個(gè)Session。這是足夠安全的、不可逆的設(shè)計(jì)。當(dāng)客戶端和服務(wù)端進(jìn)行通信的時(shí)候,在他們之間需要傳輸這個(gè)Session ID,當(dāng)客戶端發(fā)送request(請(qǐng)求)數(shù)據(jù)時(shí),ASP.NET搜索Session ID,通過(guò)Session ID檢索數(shù)據(jù)。這個(gè)過(guò)程通過(guò)以下步驟進(jìn)行:
客戶端點(diǎn)擊網(wǎng)站->客戶端信息被Session儲(chǔ)存
服務(wù)端為客戶端創(chuàng)建一個(gè)唯一的Session ID,并在服務(wù)端存儲(chǔ)這個(gè)ID
客戶端通過(guò)發(fā)送帶有SessionID的請(qǐng)求以獲取在服務(wù)端保存的信息
服務(wù)器端通過(guò)Session Provider從狀態(tài)服務(wù)(State Server)中獲取序列化后的數(shù)據(jù)并且進(jìn)行類型強(qiáng)制轉(zhuǎn)換成對(duì)象
以下為流程圖片:
客戶端、Web服務(wù)器、Session Provider的通信
參考文獻(xiàn):
SessionID in MSDN
Session模式和Session Provider
在ASP.NET中,有以下幾種Session模式可以使用
InProc
StateServer
SQLServer
Custom
每一種Session State都有一種Session Provider。以下的圖形將展示他們的關(guān)系:
Session state體系圖
我們能在這些基礎(chǔ)的Session State Provider中進(jìn)行選擇。當(dāng)ASP.NET接收到帶有Session ID的信息請(qǐng)求時(shí)Session State和他相應(yīng)的Provider負(fù)責(zé)提供和存儲(chǔ)對(duì)應(yīng)的信息。下面的表展示了Session 模式以及Provider的名稱:
Session State模式?? ?State Provider
InProc?? ?In-memory object(內(nèi)置對(duì)象)
StateServer?? ?Aspnet_state.exe
SQLServer?? ?SQL Server Database
Custom?? ?Custom provider
除此之外,還有另一個(gè)模式:“OFF”,如果我們選擇這個(gè)選項(xiàng),Session將不能為這個(gè)應(yīng)用提供服務(wù)。但是我們的目標(biāo)是使用Session,所以我們將討論上面四種的Session模式。
Session States
Session State模式基本上可以認(rèn)為把所有的Session配置、維護(hù)都交給了Web應(yīng)用。Session State他本身就是一個(gè)大東西,他基本上意味著你所有關(guān)于Session 的配置無(wú)論實(shí)在web.config或者頁(yè)面后端代碼。在web.config里元素被用作Session的配置。在元素中可以配置的有Mode(模式),Timeout(超時(shí)),StateConnectionString(State連接字符串),CustomProvider(自定義的Provider)等等。我們已經(jīng)討論過(guò)了每個(gè)部分的連接字符串在我們討論Session mode之前,接下來(lái)我們簡(jiǎn)述以下Session的一些事件:
Session事件
在ASP.NET中有兩個(gè)可以使用的Session事件:
Session_Start
Session_End
你能處理應(yīng)用中的這兩個(gè)事件在global.asax這個(gè)文件里,當(dāng)一個(gè)新的Session開(kāi)啟時(shí)session_start事件被觸發(fā),當(dāng)Session被回收或是過(guò)期時(shí)Session_End被觸發(fā):
void Session_Start(object sender, EventArgs e)
{
? ? // Code that runs when a new session is started
}
void Session_End(object sender, EventArgs e){
? ? // Code that runs when a session ends.
}
參考文獻(xiàn):
Application and Session Events
Session 模式
我們已經(jīng)討論過(guò)Session模式,接下來(lái)說(shuō)說(shuō)這些模式的不同:
Off
InProc
StateServer
SQLServer
Custom
如果我們?cè)趙eb.config內(nèi)設(shè)定Session Mode=”off”,Session將在應(yīng)用中不可用,他的設(shè)置是這樣的:
InProc Session 模式:
這是ASP.NET默認(rèn)的Session模式,他在當(dāng)前的應(yīng)用程序域中存儲(chǔ)Session信息。這是性能最好的Session模式。但是他最大的缺點(diǎn)在于:當(dāng)我們重啟服務(wù)的時(shí)候Session數(shù)據(jù)將會(huì)丟失。InProc模式有一些優(yōu)缺點(diǎn),接下來(lái)我們將詳細(xì)這些點(diǎn)。
InProc概述:
我們已經(jīng)說(shuō)過(guò),InProc模式Session數(shù)據(jù)將會(huì)儲(chǔ)存在當(dāng)前應(yīng)用程序域中,所以他是最簡(jiǎn)單、快速、好用的。
InProc模式Session數(shù)據(jù)保存在應(yīng)用程序域內(nèi)的一個(gè)集合對(duì)象,他在一個(gè)應(yīng)用程序池中進(jìn)行工作,如果我們重啟服務(wù),我們將丟失Session數(shù)據(jù)。正常情況下客戶端發(fā)送請(qǐng)求,State Provider從內(nèi)存對(duì)象中讀取數(shù)據(jù)并返回給客戶端,在web.config中我們必須提供Session模式和設(shè)置過(guò)期時(shí)間:
上面的設(shè)置中,設(shè)置了Session的過(guò)期時(shí)間為30分鐘,這也可以從后臺(tái)代碼中進(jìn)行配置。
Session.TimeOut=30;
在ASP.NET中有兩個(gè)Session事件可以進(jìn)行使用:Session_Start()和Session_End()而這種模式(后端代碼控制)只支持Session_End()事件。這個(gè)事件在Session超時(shí)時(shí)被調(diào)用,一般情況下,InProc Session模式是這樣的:
當(dāng)Session過(guò)期時(shí)Session_End()事件被調(diào)用。InProc是一個(gè)非常快的處理機(jī)制,因?yàn)闆](méi)有序列化地讀/寫過(guò)程,并且數(shù)據(jù)保存在相同的域內(nèi)。
什么時(shí)候我們使用InProc模式呢?
InProc是默認(rèn)的Session模式,他對(duì)小型應(yīng)用程序和用戶量比較小的程序非常合適,我們應(yīng)盡量避免在Web園(Web Garden)和Web農(nóng)場(chǎng)(Web Farm)情境下使用他(以后我會(huì)講到這個(gè)情境)
優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
他把Session數(shù)據(jù)存儲(chǔ)在當(dāng)前應(yīng)用程序域內(nèi),所以訪問(wèn)數(shù)據(jù)會(huì)非常的快速、簡(jiǎn)單、高效。
在InProc模式中不需要對(duì)對(duì)象進(jìn)行序列化存儲(chǔ)。
使用起來(lái)非常簡(jiǎn)單,就像ViewState一樣。
缺點(diǎn):
雖然InProc是最快的,最通用的,也是默認(rèn)的機(jī)制,但是他有許多限制:
如果工作的應(yīng)用進(jìn)程被回收,Session數(shù)據(jù)將全部丟失。
雖然他是最快的,但是當(dāng)Session數(shù)據(jù)太大和用戶過(guò)多時(shí),他會(huì)由于內(nèi)存的大量使用而影響整個(gè)程序的性能。
我們不能在Web園環(huán)境中使用這種模式。
這種模式不適合用于Web農(nóng)場(chǎng)(Web Farm)環(huán)境中。
現(xiàn)在,我們來(lái)看看其他可用的方法來(lái)規(guī)避這些缺點(diǎn),首先是StateServer模式:
StateServer Session模式
StateServer模式概述
這也叫做Out-Proc Session模式。StateServer使用了一個(gè)獨(dú)立的Windows服務(wù)來(lái)提供Session服務(wù),他獨(dú)立于IIS,也能獨(dú)使用一臺(tái)服務(wù)器。StateServer的服務(wù)來(lái)自于aspnet_state.exe提供。這個(gè)服務(wù)也能和您的應(yīng)用服務(wù)共同運(yùn)行在同一臺(tái)服務(wù)器上,注意他是獨(dú)立于Web應(yīng)用程序域的一個(gè)服務(wù)。這意味著你重啟你的Web服務(wù)后Session數(shù)據(jù)依然存在。這個(gè)方案的缺點(diǎn)在于有一個(gè)性能瓶頸:數(shù)據(jù)讀寫需要進(jìn)行序列化和反序列化,因?yàn)椴皇峭粋€(gè)應(yīng)用程序域,所以他也增加了數(shù)據(jù)讀寫的性能消耗,因?yàn)樗麄兪莾蓚€(gè)不同的進(jìn)程。
配置StateServer Session模式
在StateServer模式里,Session數(shù)據(jù)存儲(chǔ)在獨(dú)立于IIS的一個(gè)服務(wù)里。這個(gè)進(jìn)程作為一個(gè)Windows服務(wù)運(yùn)行,你能在Windows服務(wù)管理器(MMC)或者命令行中進(jìn)行啟動(dòng)。
默認(rèn)情況下,ASP.NET StateServer(中文名:ASP.NET狀態(tài)服務(wù))默認(rèn)情況下啟動(dòng)方式是“手動(dòng)”我們必須將他設(shè)置為自動(dòng)。
如果從命令行啟動(dòng)的化只需要輸入:”net start aspnet_state”;默認(rèn)情況下,這個(gè)服務(wù)監(jiān)聽(tīng)TCP端口42424,但是我們可以在注冊(cè)表里改變這個(gè)設(shè)置,如圖:
現(xiàn)在,我們來(lái)看一看web.config對(duì)StateServer的設(shè)置,在StateServer的設(shè)置里我們需要指定StateServer連接字符串stateConnectionString:指向運(yùn)行StateServer的系統(tǒng)。默認(rèn)設(shè)置下,StateConnectionString使用IP127.0.0.1(localhost)端口使用42424。
當(dāng)我們使用StateServer,我們還能設(shè)置超時(shí)stateNetworkTimeOut特性指定等待服務(wù)響應(yīng)的秒數(shù),即發(fā)出請(qǐng)求到取消響應(yīng)的事件時(shí)間間隔。默認(rèn)情況下是10秒。
當(dāng)使用StateServer進(jìn)行存儲(chǔ)時(shí)對(duì)象將被序列化進(jìn)行儲(chǔ)存,而讀取對(duì)象時(shí),將對(duì)數(shù)據(jù)進(jìn)行反序列化,我們來(lái)看下面的例子:
StateServer是如何工作的
我們使用StateServer來(lái)避免當(dāng)重啟Web服務(wù)時(shí)無(wú)謂的Session數(shù)據(jù)丟失。StateServer是在aspnet_state.exe進(jìn)程作為一個(gè)服務(wù)來(lái)進(jìn)行維護(hù)的,這個(gè)進(jìn)程維護(hù)著所有的Session數(shù)據(jù),但是在存儲(chǔ)到StateServer之前我們需要對(duì)數(shù)據(jù)進(jìn)行序列化。
如上圖所示,客戶端發(fā)送請(qǐng)求到Web服務(wù)器,Web服務(wù)器將Session數(shù)據(jù)存儲(chǔ)在StateServer里,StateServer也許在當(dāng)前的系統(tǒng)里,也可能在另一個(gè)系統(tǒng)里,但他一定是獨(dú)立于IIS的,為了實(shí)現(xiàn)他,我們必須在web.config里進(jìn)行配置stateConnectionString。例如我們?cè)O(shè)置指向127.0.0.1:42424,這將把數(shù)據(jù)存儲(chǔ)在本地的系統(tǒng)內(nèi),為了實(shí)現(xiàn)改變StateServer指向的目的,我們改變了IP,并且確定aspnet_state.exe正常運(yùn)行于這個(gè)系統(tǒng)上,接下來(lái)當(dāng)你需要讀寫Session時(shí)(也就是通過(guò)修改IP來(lái)導(dǎo)致一個(gè)錯(cuò)誤的指向),你就會(huì)引發(fā)下圖這樣的異常:
當(dāng)我們存儲(chǔ)一個(gè)對(duì)象到Session,對(duì)象將被序列化。系統(tǒng)利用State Provider將數(shù)據(jù)存儲(chǔ)進(jìn)StateServer。當(dāng)讀取數(shù)據(jù)時(shí),State Provider將返回?cái)?shù)據(jù),完整的流程圖如下圖:
StateServer Session模式例子:
這是一個(gè)簡(jiǎn)單的使用StateServer Session模式的例子,我直接在IIS里創(chuàng)建這個(gè)例子,能輕松地明白他的用法:
步驟1:打開(kāi)Visual Studio>文件>新建>網(wǎng)站。選擇HTTP作為web應(yīng)用的位置。
現(xiàn)在你打開(kāi)IIS,你將會(huì)看到創(chuàng)建了一個(gè)虛擬目錄,名字是你的應(yīng)用名,在我的例子中是StateServer。
步驟2:創(chuàng)建一個(gè)簡(jiǎn)單的UI:他將獲取一個(gè)學(xué)生的角色編號(hào)和名字,我們將保存名字和編號(hào)到StateServer Session里。我也將創(chuàng)建一個(gè)類:StudentInfo,這個(gè)類的定義如下:
[Serializable]
public class StudentInfo
{
? ? //Default Constructor
? ? public StudentInfo(){}
? ? // Create object of student Class
? ? //Int RollNumber
? ? ///String Name
? ? public StudentInfo(int intRoll, string strName)
? ? {
? ? ? ? this.Roll = intRoll;
? ? ? ? this.Name = strName;
? ? }
? ? private int intRoll;
? ? private string strName;
? ? public int Roll{
? ? ? ? get{return intRoll;}
? ? ? ? set{intRoll = value;}
? ? }
? ? public string Name{
? ? ? ? get{return strName;}
? ? ? ? set{strName = value;}
? ? }
} ? ? ? ? ??
現(xiàn)在來(lái)看后端代碼,我增加了兩個(gè)Button:一個(gè)是保存Session,另一個(gè)是獲取Session:
protected void btnSubmit_Click(object sender, EventArgs e)
{
? ? StudentInfo _objStudentInfo =new StudentInfo(Int32.Parse( txtRoll.Text) ,txtUserName.Text);
? ? Session["objStudentInfo"] = _objStudentInfo;ResetField();
}
protected void btnRestore_Click(object sender, EventArgs e)
{
? ? StudentInfo _objStudentInfo = (StudentInfo) Session["objStudentInfo"];
? ? txtRoll.Text = _objStudentInfo.Roll.ToString();
? ? txtUserName.Text = _objStudentInfo.Name;
}
步驟3:配置你的web.config的StateServer,在之前介紹過(guò),請(qǐng)確保web.config在配置所指向的服務(wù)器上的State Server是處于開(kāi)啟并運(yùn)行的狀態(tài)。
步驟4:運(yùn)行應(yīng)用。
輸入數(shù)據(jù),點(diǎn)擊Submit。
接下來(lái)的測(cè)試,我將完整的解釋如何使用StateServer
首先:移除StudentInfo類[Serializable]特性,然后運(yùn)行應(yīng)用。當(dāng)你點(diǎn)解Submit按鈕,你將看到如下的錯(cuò)誤:
清晰地指出了在存儲(chǔ)之前你必須序列化你的對(duì)象。
第二:運(yùn)行程序,在點(diǎn)擊了Submit按鈕保存數(shù)據(jù)后,重啟IIS
如果在InProc中,我保證你的Session數(shù)據(jù)將會(huì)丟失,但是在StateServer中,點(diǎn)擊Restore Session按鈕,你將獲取你的原始數(shù)據(jù),因?yàn)镾tateServer數(shù)據(jù)不依賴于IIS,它獨(dú)立地保存數(shù)據(jù)。
第三:在Windows 服務(wù)管理程序(MMC)中停止StateServer服務(wù),你再點(diǎn)擊Submit按鈕,你將看到如下錯(cuò)誤:
因?yàn)槟愕腟tateServer進(jìn)程沒(méi)有運(yùn)行,所以當(dāng)你在使用StateServer的時(shí)候,請(qǐng)牢記這三點(diǎn)。
優(yōu)點(diǎn)和缺點(diǎn)
基于上述討論:
優(yōu)點(diǎn):
StateServer獨(dú)立于IIS運(yùn)行,所以無(wú)論IIS出什么問(wèn)題都影響不到StateServer的數(shù)據(jù)。
他能在Web Farm和Web Garden環(huán)境中使用。
缺點(diǎn):
要進(jìn)行序列化和反序列化,拖慢速度。
StateServer需要保證正常運(yùn)行。
我在這里停止StateServer的講述,你將在負(fù)載均衡中看到他更多更有趣的點(diǎn),Web Farm,Web Garden情境下。
參考文獻(xiàn):
State Server Session Mode
ASP.NET Session State
SQL Server Session模式
SQL Server模式簡(jiǎn)介
ASP.NET這個(gè)Session模式提供給我們了更強(qiáng)的安全性和可靠性,在這個(gè)模式下,Session數(shù)據(jù)被序列化并存儲(chǔ)到一個(gè)SQL Server的數(shù)據(jù)庫(kù)中,這個(gè)模式缺點(diǎn)在于Session需要序列化和反序列化的讀寫方式成為了主要的性能瓶頸,他是Web Farm的最佳選擇。
設(shè)置SQL Server,我們需要這些SQL腳本:
安裝:InstallSqlState.sql
卸載:UninstallSQLState.sql
最簡(jiǎn)單的配置方式是利用aspnet_regsql命令。
之前已經(jīng)解釋過(guò)了如何配置,這是最有用的狀態(tài)管理方法在web Farm模式里。
我們?yōu)楹问褂肧QL Server模式?
SQL Server Session模式提供了更安全、更可靠的Session管理。
他保證了數(shù)據(jù)在一個(gè)集中式的環(huán)境中(數(shù)據(jù)庫(kù))。
當(dāng)我們需要更安全地實(shí)現(xiàn)Session時(shí)就應(yīng)該使用SQL Server模式。
假如服務(wù)器經(jīng)常需要重啟,這是一個(gè)完美的解決方案。
這是一個(gè)完美解決web Farm和web園的方案(這個(gè)我將在后面詳細(xì)解釋)。
當(dāng)我們需要在兩個(gè)應(yīng)用間共享Session時(shí)我們需要使用SQL Server模式。
配置SQL Server Session模式
在SQL Server模式中,我們的數(shù)據(jù)保存在SQL Server中,所以我們首先要在web.config里提供數(shù)據(jù)庫(kù)連接字符串,sqlConnectionString是被用來(lái)做這事的。
在連接字符串配置完成后,我們將要配置SQL Server,我將在這里演示如何用aspnet_regsql命令進(jìn)行數(shù)據(jù)庫(kù)配置。
第一步:進(jìn)入命令行,進(jìn)入到Framework version目錄E.g. :c:\windows\microsoft.net\framework\。
第二步,帶參運(yùn)行aspnet_regsql命令。
下面是參數(shù)的使用:
Parameters?? ?Description
-ssadd?? ?增加 SQLServer 模式 session state.
-sstype p?? ?P 持久化.將這些數(shù)據(jù)持久化存儲(chǔ)于數(shù)據(jù)庫(kù)中
-S?? ?服務(wù)器名
-U?? ?用戶名
-P?? ?密碼.
?
運(yùn)行結(jié)束后,你見(jiàn)看到如下的信息:
配置結(jié)束。
第三步:
打開(kāi)SQL Server,查看數(shù)據(jù)庫(kù)ASPState庫(kù),將有兩張表:
ASPStateTempApplications
ASPStateTempSessions
更改設(shè)置中的連接字符串,建立一個(gè)像StateServer例子中那樣的應(yīng)用
點(diǎn)擊Submit時(shí)保存Roll Number和用戶名,打開(kāi)數(shù)據(jù)庫(kù),進(jìn)入ASPStateTempSessions表,這是你保存的Session數(shù)據(jù):
現(xiàn)在我們?cè)賮?lái)討論以下StateServer模式中所討論的幾個(gè)問(wèn)題:
1、從StydentInfo類中移除Serialize特性(keyword)
2、重啟IIS再讀取Session數(shù)據(jù)
3、停止SQL Server服務(wù)
我想這些問(wèn)題我已經(jīng)在StateServer解釋得很清楚了。
(注:第一種將導(dǎo)致無(wú)法序列化對(duì)象,會(huì)拋出異常,第二種無(wú)影響,第三種,在關(guān)閉數(shù)據(jù)庫(kù)服務(wù)時(shí)會(huì)有影響,而重啟數(shù)據(jù)庫(kù)服務(wù)將找回Session內(nèi)的數(shù)據(jù),因?yàn)樗浅志没瘍?chǔ)存的。)
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
Session數(shù)據(jù)不受IIS重啟的影響
最可靠和最安全的Session管理模式
他在本地中心化保存Session數(shù)據(jù),能使其他應(yīng)用方便地進(jìn)行訪問(wèn)
在Web Farm 和Web Garden情境下非常實(shí)用
缺點(diǎn):
和默認(rèn)模式比較起來(lái),會(huì)顯得很慢
對(duì)象的序列化和反序列化會(huì)成為性能瓶頸
因?yàn)樾枰诓煌姆?wù)器上訪問(wèn)SQL Server,我們必須保證SQL Server的穩(wěn)定運(yùn)行。
參考資料:
Read more about SQLServer mode
自定義Session模式
通常情況下,我們使用InProc模式、StateServer模式、SQL Server模式就夠了,可是我們還是需要了解一些用戶自定義Session模式的相關(guān)知識(shí)。這是一種相當(dāng)有趣的Session模式,因?yàn)橛脩舻腟ession全部交由了我們進(jìn)行控制,甚至Session ID,你都能通過(guò)自己寫算法來(lái)生成Session ID。
你能夠容易地從基類SessionStateStoreProviderBase開(kāi)發(fā)出自定義的Provider,你也能通過(guò)實(shí)現(xiàn)ISessionIDManager接口來(lái)產(chǎn)生SessionID。
下圖是自定義方法的處理過(guò)程:
在Initialize方法中,我們能設(shè)置一個(gè)自定義Provider。他將提供給Provider初始化連接。SetItemExpireCallback被用作提供SessionTimeOut(Session過(guò)期),當(dāng)Session過(guò)期時(shí)我們能注冊(cè)一個(gè)方法進(jìn)行調(diào)用。InitializeRequest在請(qǐng)求發(fā)起的時(shí)候被調(diào)用,CreateNewStoreData在創(chuàng)建一個(gè)SessionStateStoreData(Session數(shù)據(jù)存儲(chǔ)類)實(shí)例時(shí)候被調(diào)用。
我們何時(shí)使用自定義Session模式?
1、 當(dāng)我們想將Session數(shù)據(jù)存儲(chǔ)在SQL Server之外的數(shù)據(jù)庫(kù)內(nèi)時(shí)。
2、 當(dāng)我們必須使用一個(gè)已存在的(特定的)表來(lái)存儲(chǔ)Session數(shù)據(jù)的時(shí)候。
3、 當(dāng)我們需要使用自定義的SessionID的時(shí)候
如何配置自定義Session模式?
我們需要在web.config里進(jìn)行這樣的配置:
如果你想了解更多的關(guān)于自定義模式的信息,請(qǐng)查閱參考資料。
優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
1、 我們能使用一個(gè)已存在的表(指定的表)來(lái)存儲(chǔ)Session數(shù)據(jù)。當(dāng)我們使用一個(gè)之前使用的數(shù)據(jù)庫(kù)時(shí),這樣做是很有用的。
2、 他獨(dú)立于IIS運(yùn)行,所以重啟服務(wù)器對(duì)他也沒(méi)有影響。
3、 我們能建立自己的Session ID邏輯來(lái)分配Session ID。
缺點(diǎn):
1、 處理數(shù)據(jù)很慢。
2、 創(chuàng)建一個(gè)自定義的Session狀態(tài)Provider是一個(gè)基礎(chǔ)性(low-level)任務(wù),他需要小心處理各種情況以及保證數(shù)據(jù)安全。
我推薦您使用第三方提供的Provider而不是自己寫一套Provider。
參考資料:
Custom Mode
生產(chǎn)部署的概述:
在實(shí)際的生產(chǎn)工作環(huán)境中部署我們的應(yīng)用對(duì)于一個(gè)Web開(kāi)發(fā)者來(lái)說(shuō)是一個(gè)非常重大的挑戰(zhàn)。因?yàn)樵诖蟮纳a(chǎn)環(huán)境中,有大量的用戶數(shù)據(jù)需要處理,數(shù)據(jù)量大到一臺(tái)服務(wù)器難以負(fù)載這么巨大的數(shù)據(jù)處理量。這個(gè)概念來(lái)自于Web Farm,Web Garden,負(fù)載均衡的使用。
在幾個(gè)月前,我部署了一個(gè)實(shí)際環(huán)境:這個(gè)環(huán)境要處理百萬(wàn)級(jí)的用戶訪問(wèn)以及超過(guò)10個(gè)域控制器,通過(guò)負(fù)載均衡搭載了超過(guò)10臺(tái)服務(wù)器和服務(wù)數(shù)據(jù)庫(kù)。例如交易服務(wù)器、LCS服務(wù)器。最大的挑戰(zhàn)來(lái)自于跨多個(gè)服務(wù)器的Session管理。下圖對(duì)這個(gè)生產(chǎn)環(huán)境展示了一個(gè)簡(jiǎn)單的圖形:
我將試著解釋并讓您記住各個(gè)不同應(yīng)用場(chǎng)景。
應(yīng)用程序池
這是當(dāng)您在創(chuàng)建一個(gè)實(shí)際生產(chǎn)環(huán)境時(shí)最重要的一個(gè)東西。應(yīng)用程序池是用在IIS里用來(lái)分隔不同的工作進(jìn)程的應(yīng)用程序的,應(yīng)用程序池能分隔我們的應(yīng)用程序,使其獲得更好的安全性,可靠性和有效性。應(yīng)用程序池的應(yīng)用在服務(wù)器中當(dāng)一個(gè)進(jìn)程出現(xiàn)問(wèn)題,或者被回收時(shí)其他進(jìn)程不受影響。
應(yīng)用程序池的角色:
應(yīng)用程序池的配置角色是一個(gè)重要的安全措施,在IIS6和IIS7里。因?yàn)楫?dāng)應(yīng)用程序訪問(wèn)資源時(shí)他指定了應(yīng)用程序的身份。在IIS7里,有三種預(yù)定義的身份指定方式,這和IIS6是一樣的。
應(yīng)用程序池角色?? ?描述
LocalSystem?? ?內(nèi)建于服務(wù)器上管理權(quán)限的賬戶. 他能訪問(wèn)本地和遠(yuǎn)程資源. 任何服務(wù)器的文件或者資源, 我們必須把應(yīng)用程序的身份設(shè)置為L(zhǎng)ocalSystem.
LocalServices?? ?內(nèi)置的本地身份驗(yàn)證. 他不能進(jìn)行任何網(wǎng)絡(luò)訪問(wèn)。
NetworkServices?? ?這是應(yīng)用程序池的默認(rèn)身份,NetworkServices是一個(gè)經(jīng)過(guò)驗(yàn)證的本地用戶賬戶權(quán)限。
建立和指定應(yīng)用程序池
打開(kāi)IIS管理頁(yè)面,右鍵單擊應(yīng)用程序池目錄->新建
給應(yīng)用程序池一個(gè)ID,然后點(diǎn)擊OK。
現(xiàn)在,右鍵單擊一個(gè)虛擬目錄(我正在使用的StateServer站點(diǎn))分配StateServerAppPool給StateServer虛擬目錄。
現(xiàn)在這個(gè)StateServer站點(diǎn)運(yùn)行在了一個(gè)指定的獨(dú)立的應(yīng)用程序池StateServerAppPool里。其他任何應(yīng)用都不會(huì)影響到這個(gè)程序。這是獨(dú)立應(yīng)用程序池的主要優(yōu)點(diǎn)。
Web Garden
默認(rèn)情況下,每一個(gè)應(yīng)用程序池都運(yùn)行在一個(gè)獨(dú)立的工作進(jìn)程里(W3Wp.exe)。我們能分配多個(gè)進(jìn)程給單個(gè)應(yīng)用程序池,一個(gè)應(yīng)用程序池跑多個(gè)進(jìn)程,這樣的情況叫做Web Garden(Web園),多個(gè)工作進(jìn)程單個(gè)應(yīng)用程序在很多情況下都能夠有更優(yōu)秀的輸出性能和更少的相應(yīng)時(shí)間,每一個(gè)工作進(jìn)程都會(huì)有他們自己的線程和內(nèi)存空間。
如上圖所示,在IIS里,將會(huì)有多個(gè)應(yīng)用程序池,并且每個(gè)應(yīng)用程序池至少有一個(gè)工作進(jìn)程,而一個(gè)Web Garden將有多個(gè)工作進(jìn)程。
在你的應(yīng)用程序里,使用Web園將必然出現(xiàn)一個(gè)限制條件:如果我們使用InProc模式,我們的應(yīng)用程序?qū)o(wú)法正確的工作,因?yàn)镾ession將工作在不同的進(jìn)程里。為了避免這樣的問(wèn)題,我們將使用進(jìn)程外(OurProc)的Session模式,我們可以使用State Server或者SQL Server Session模式。
主要優(yōu)點(diǎn):
在Web園內(nèi)的工作進(jìn)程對(duì)每個(gè)進(jìn)程都共享請(qǐng)求,如果一個(gè)進(jìn)程掛了,其他的進(jìn)程還能正常工作,繼續(xù)處理請(qǐng)求。
如何建立一個(gè)Web Garden?
右鍵單擊程序池->Performance(性能?)選項(xiàng)卡->選擇Web Garden(Web園)部分
默認(rèn)情況下他的值為1,現(xiàn)在把他改為一個(gè)比1大的數(shù)字。
如何在Web園內(nèi)指定Session?
我已經(jīng)解釋過(guò)InProc模式是在單個(gè)工作進(jìn)程中進(jìn)行處理,在進(jìn)程內(nèi)存儲(chǔ)對(duì)象,現(xiàn)在,如果我們要處理多個(gè)進(jìn)程,Session處理將會(huì)變得很困難,因?yàn)槊總€(gè)工作進(jìn)程獨(dú)享自己的內(nèi)存。那么假如第一個(gè)請(qǐng)求數(shù)據(jù)到了WP1并且保存了Session數(shù)據(jù),第二個(gè)請(qǐng)求到了WP2我將無(wú)法正確獲得Session的數(shù)據(jù),取值的話將會(huì)拋出異常。所以,請(qǐng)避免在Web Garden模式下使用InProc模式。
我們使用StateServer或者SQLServer模式對(duì)這種情況進(jìn)行處理,之前解釋過(guò),這兩種模式不依賴于工作進(jìn)程,在之前的例子里也說(shuō)過(guò)當(dāng)IIS重啟你依然能訪問(wèn)到Session數(shù)據(jù)。
Session模式?? ?是否推薦
InProc?? ?No
StateServer?? ?Yes
SQLServer?? ?Yes?
Web Farm和負(fù)載均衡
這是在生產(chǎn)環(huán)境中最常見(jiàn)的情形,當(dāng)你需要在多臺(tái)服務(wù)器上部署你的應(yīng)用時(shí),使用這種模式的主要原因是我們要將負(fù)載均衡到多臺(tái)服務(wù)器上,一個(gè)負(fù)載均衡器被用于分發(fā)負(fù)載到多臺(tái)服務(wù)器上。
我們來(lái)看上圖,客戶端通過(guò)URL發(fā)送請(qǐng)求時(shí)先到負(fù)載均衡器,然后通過(guò)負(fù)載均衡器將請(qǐng)求分發(fā)給服務(wù)器,負(fù)載均衡器將在不同的服務(wù)器之間進(jìn)行請(qǐng)求的分發(fā)。
現(xiàn)在我們?nèi)绾翁幚砦覀兊腟ession呢?
在WEB Farm和負(fù)載均衡情況下處理Session
在Web Farm中處理Session是一個(gè)有挑戰(zhàn)性的工作。
InProc:InProc Session模式,Session數(shù)據(jù)以對(duì)象形式被存儲(chǔ)在工作進(jìn)程中,每個(gè)服務(wù)器將有他自己的工作進(jìn)程,并將保持Session數(shù)據(jù)在內(nèi)存中。
假如一臺(tái)服務(wù)器down了,那么請(qǐng)求將會(huì)訪問(wèn)其他服務(wù)器,而其他服務(wù)器里是不存在相應(yīng)Session數(shù)據(jù)的。所以在Web Farm情形下不推薦使用InProc模式。
State Server:之前已經(jīng)解釋過(guò)如何使用和配置StateServer模式了,在WebFarm的環(huán)境下你將了解他是多么的重要,因?yàn)樗蠸ession數(shù)據(jù)將在一個(gè)位置進(jìn)行存儲(chǔ)。
記住,在web Farm環(huán)境里,你必須保證你有相同的節(jié)在你所有的web服務(wù)器上,其他配置和之前描述的一致,所有的web.config文件都要有相同的配置屬性(stateConnectionString)在Session State里。
SQL Server:這是另一個(gè)選擇,這也是在Web Farm環(huán)境里的最佳選擇,我們首先需要配置數(shù)據(jù)庫(kù),接下來(lái)的步驟之前已經(jīng)說(shuō)過(guò)了。
如上圖所示,所有的web服務(wù)器Session數(shù)據(jù)都將被存儲(chǔ)于一個(gè)SQL Server數(shù)據(jù)庫(kù)。請(qǐng)記住一點(diǎn),在StateServer模式和SQL Server模式下你都將把對(duì)象進(jìn)行序列化存儲(chǔ)。當(dāng)一臺(tái)Web服務(wù)器掛掉的時(shí)候,負(fù)載均衡器將把請(qǐng)求分發(fā)到其他服務(wù)器他將能從數(shù)據(jù)庫(kù)里取出Session數(shù)據(jù),因?yàn)樗蠸ession數(shù)據(jù)都是存放于數(shù)據(jù)庫(kù)里的。
總之,我們能用StateServer和SQL Server模式來(lái)進(jìn)行Web Farm的部署,我們需要盡量避免使用InProc模式。
Session和Cookie
客戶端使用Cookie來(lái)配合使用Session,因?yàn)榭蛻舳诵枰o每個(gè)請(qǐng)求提供合適的Session ID,我們可以使用下列的方法:
使用Cookie
ASP.NET使用了一個(gè)特定的Cookie名叫作:ASP.NET_SessionId這是當(dāng)Session集合被創(chuàng)建的時(shí)候自動(dòng)提供的,這是默認(rèn)設(shè)置,Session ID通過(guò)Cookie進(jìn)行傳送。
Cookie Munging
當(dāng)用戶向服務(wù)器發(fā)送一個(gè)請(qǐng)求時(shí),服務(wù)器解碼Session ID并將他加入到每個(gè)頁(yè)面的鏈接里,當(dāng)用戶點(diǎn)擊鏈接,ASP.NET編碼Session ID并傳送到用戶所請(qǐng)求的頁(yè)面,現(xiàn)在,請(qǐng)求的頁(yè)面可以獲取Session變量了。這一切都是自動(dòng)完成的,當(dāng)ASP.NET發(fā)現(xiàn)用戶瀏覽器不支持Cookie時(shí)。
如何實(shí)現(xiàn)Cookie Munging
為了這個(gè),我們必須保證我們的Session State為Cookie-less。
移除Session
下面的方法被用來(lái)移除Session
方法?? ?描述
Session.Remove(strSessionName)?? ?從Session State中移除一個(gè)項(xiàng)目
Session.RemoveAll()?? ?從Session集合中移除所有項(xiàng)目
Session.Clear()?? ?從Session集合中移除所有項(xiàng)目. Note: Clear和RemoveAll.RemoveAll()沒(méi)有區(qū)別Clear()是內(nèi)部的.
Session.Abandon()?? ?取消當(dāng)前的Session。
啟用和禁用Session
從性能優(yōu)化來(lái)說(shuō),我們可以啟用或禁用Session,因?yàn)槊總€(gè)頁(yè)面都進(jìn)行讀寫Session會(huì)出現(xiàn)一些性能開(kāi)銷,所以,更合適地啟用或者禁用Session,而不是使用他的默認(rèn)配置:always。我們啟用和禁用Session可以采取兩種方式:
頁(yè)面級(jí)
應(yīng)用級(jí)
頁(yè)面級(jí)
我們能禁用Session在頁(yè)面指令的EnableSessionState屬性中
同樣的,我們可以讓他成為只讀的,這將只允許訪問(wèn)Session而禁止寫入信息到Session
應(yīng)用級(jí)
通過(guò)設(shè)置web.config的屬性EnableSessionState可以讓Session在整個(gè)應(yīng)用程序內(nèi)被禁用,
一般我們都是采用頁(yè)面級(jí)的限制,這樣能靈活控制Session的使用。
參考文獻(xiàn):
How to Disable ASP.NET Session State
總結(jié)
希望你現(xiàn)在能更熟悉Session了,如何使用Session,以及如何在Web Farm中使用,總結(jié)如下:
1、 InProc Session Provider是最快的,因?yàn)樗袛?shù)據(jù)都存在應(yīng)用程序的內(nèi)存里,Session數(shù)據(jù)在IIS重啟,或者站點(diǎn)被回收的情況下丟失,你可以在用戶量較小的網(wǎng)站上使用這種模式,但別在Web Farm下使用。
2、 State Server模式:Session數(shù)據(jù)被存儲(chǔ)于aspnet_state.exe應(yīng)用中,他在Web服務(wù)之外保存Session數(shù)據(jù),所以Web服務(wù)出現(xiàn)問(wèn)題不會(huì)對(duì)他的Session數(shù)據(jù)造成影響,在將Session數(shù)據(jù)存儲(chǔ)到StateServer之前需要序列化對(duì)象,在Web Farm中我們能安全地使用這個(gè)模式。
3、 SQL Server模式:他將Session數(shù)據(jù)保存到SQL Server中,我們需要提供連接串,我們存儲(chǔ)時(shí)也需要對(duì)對(duì)象進(jìn)行序列化,這種模式在實(shí)際Web Farm的生產(chǎn)環(huán)境中是非常有用的。
4、 我們也能使用自定義模式,當(dāng)我們需要使用一個(gè)已經(jīng)存在的表來(lái)存儲(chǔ)Session數(shù)據(jù)時(shí),在自定義模式中,我們也能創(chuàng)建自定義的Session ID,但是不推薦你自己來(lái)實(shí)現(xiàn)Provider,推薦使用第三方的Provider。
========
ASP.NET Session 簡(jiǎn)單超實(shí)用使用總結(jié)
https://www.cnblogs.com/yinrq/p/5032493.html
一、概述
Session用于存儲(chǔ)特定的用戶會(huì)話所需的信息 。 Session對(duì)象的引入是為了彌補(bǔ)HTTP協(xié)議的不足,HTTP協(xié)議是一種無(wú)狀態(tài)的協(xié)議。
Session中文是“會(huì)話”的意思,在ASP.NET中代表了服務(wù)器與客戶端之間的“會(huì)話”。Session的作用時(shí)間從用戶到達(dá)某個(gè)特定的Web頁(yè)開(kāi)始,到該用戶離開(kāi)Web站點(diǎn),或在程序中利用代碼終止某個(gè)Session結(jié)束。引用Session 則可以讓一個(gè)用戶訪問(wèn)多個(gè)頁(yè)面之間的切換也會(huì)保留該用戶的信息。
系統(tǒng)為每個(gè)訪問(wèn)者都設(shè)立一個(gè)獨(dú)立的Session對(duì)象,用以存儲(chǔ)Session變量,并且各個(gè)訪問(wèn)者的Session對(duì)象互不干擾。
Session與Cookie是緊密相關(guān)的。 Session的使用要求用戶瀏覽器必須支持Cookie,如果瀏覽器不支持使用Cookie,或者設(shè)置為禁用Cookie,那么將不能使用Session。
Session信息對(duì)客戶來(lái)說(shuō),不同的用戶用不同的Session信息來(lái)記錄。當(dāng)用戶啟用Session時(shí),ASP自動(dòng)產(chǎn)生一個(gè)SessionID.在新會(huì)話開(kāi)始時(shí),服務(wù)器將SessionID當(dāng)做cookie存儲(chǔ)在用戶的瀏覽器中。
二、Session數(shù)據(jù)存放的位置和形式
web.config 配置節(jié)點(diǎn)語(yǔ)法:
<system.web>
<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"
/>
</system.web>
mode:設(shè)置將Session信息存儲(chǔ)到哪里
? ? ? ? Off:不使用Session功能;?
? ? ? ? InProc :將Session存儲(chǔ)在IIS進(jìn)程內(nèi),這是默認(rèn)值,也最常用(優(yōu)點(diǎn)是簡(jiǎn)單,性能最高。但是當(dāng)重啟IIS服務(wù)器時(shí)Session丟失。);?
? ? ? ? StateServer :將Session存儲(chǔ)在ASP.NET狀態(tài)服務(wù)進(jìn)程中(重新啟動(dòng)Web應(yīng)用程序時(shí)保留會(huì)話狀態(tài),并使會(huì)話狀態(tài)可以用于網(wǎng)絡(luò)中的多個(gè)Web服務(wù)器。);?
? ? ? ? SQLServer :將Session存儲(chǔ)在SQL Server中(存儲(chǔ)在內(nèi)存和磁盤中,服務(wù)器掛掉重啟后都還在)。?
cookieless:設(shè)置客戶端的Session信息存儲(chǔ)到哪里
? ? ? ? ture 使用Cookieless模式;這時(shí)客戶端的Session信息就不再使用Cookie存儲(chǔ)了,而是將其通過(guò)URL存儲(chǔ)。
? ? ? ? false 使用Cookie模式,這是默認(rèn)值。
timeout 設(shè)置經(jīng)過(guò)多少分鐘后服務(wù)器自動(dòng)放棄Session信息。默認(rèn)為20分鐘。?
stateConnectionString 設(shè)置將Session信息存儲(chǔ)在狀態(tài)服務(wù)中時(shí)使用的服務(wù)器名稱和端口號(hào),例如:"tcpip=127.0.0.1:42424”。當(dāng)mode的值是StateServer是,這個(gè)屬性是必需的。(默認(rèn)端口42424)。?
sqlConnectionString 設(shè)置與SQL Server連接時(shí)的連接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=joye"。當(dāng)mode的值是SQLServer時(shí),這個(gè)屬性是必需的。
stateNetworkTimeout 設(shè)置當(dāng)使用StateServer模式存儲(chǔ)Session狀態(tài)時(shí),經(jīng)過(guò)多少秒空閑后,斷開(kāi)Web服務(wù)器與存儲(chǔ)狀態(tài)信息的服務(wù)器的TCP/IP連接的。默認(rèn)值是10秒鐘。
三、Session的curd操作
代碼:
? ? ? ? ? ? ?//寫入
? ? ? ? ? ? Session["UserName"] = "joye888";
? ? ? ? ? ? //讀取
? ? ? ? ? ? var userName = Session["UserName"].ToString();
? ? ? ? ? ? Response.Write(userName);
? ? ? ? ? ? //遍歷
? ? ? ? ? ? IEnumerator sessionEnum = Session.Keys.GetEnumerator();
? ? ? ? ? ? while (sessionEnum.MoveNext())
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Response.Write(Session[sessionEnum.Current.ToString()].ToString() + " ");
? ? ? ? ? ? }?
? ? ? ? ? ? //銷毀
? ? ? ? ? ? Session.Abandon(); //結(jié)束會(huì)話
? ? ? ? ? ? Session.Clear();//不結(jié)束會(huì)話
四、Session運(yùn)行原理圖解
五、Session實(shí)際案例-在線購(gòu)物車和Session配合驗(yàn)證碼使用
代碼省略。
六、Session和Cookie的區(qū)別
1、cookie存客戶端,session存服務(wù)端。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙。
3、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問(wèn)增多,會(huì)比較占用你服務(wù)器的性能
考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。
4、單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。
========
ASP.NET 狀態(tài)服務(wù) 及 session丟失問(wèn)題解決方案總結(jié)
https://blog.csdn.net/qq_28960147/article/details/80964532
ASP.NET 狀態(tài)服務(wù) 及 session丟失問(wèn)題解決方案總結(jié)
最近在開(kāi)發(fā)一ASP.NET2.0系統(tǒng)時(shí),在程序中做刪除或創(chuàng)建文件操作時(shí),出現(xiàn)session丟失問(wèn)題。在網(wǎng)上搜了不少資料,最后終于解決了,采用了如下方法:
1、asp.net Session的實(shí)現(xiàn):
asp.net的Session是基于HttpModule技術(shù)做的,HttpModule可以在請(qǐng)求被處理之前,對(duì)請(qǐng)求進(jìn)行狀態(tài)控制,由于Session本身就是用來(lái)做狀態(tài)維護(hù)的,因此用HttpModule做Session是再合適不過(guò)了。
ASP.NET中Session的狀態(tài)保持方式
ASP.NET提供了Session對(duì)象,從而允許程序員識(shí)別、存儲(chǔ)和處理同一個(gè)瀏覽器對(duì)象對(duì)服務(wù)器上某個(gè)特定網(wǎng)絡(luò)應(yīng)用程序的若干次請(qǐng)求的上下文信息。Session對(duì)應(yīng)瀏覽器與服務(wù)器的同一次對(duì)話,在瀏覽器第一請(qǐng)求網(wǎng)絡(luò)應(yīng)用程序的某個(gè)頁(yè)面時(shí),服務(wù)器會(huì)觸發(fā)Session_onStart事件;在對(duì)話超時(shí)或者被關(guān)閉的時(shí)候會(huì)觸發(fā)Session_onEnd 事件。程序員可以在代碼中響應(yīng)這兩個(gè)事件來(lái)處理與同一次對(duì)話相關(guān)的任務(wù),如開(kāi)辟和釋放該次對(duì)話要使用的資源等。
? ?在ASP.NET的程序中要使用Session對(duì)象時(shí),必須確保頁(yè)面的@page指令中EnableSessionState屬性是True或者Readonly,并且在web.config文件中正確的設(shè)置了SessionState屬性。
? ASP.NET中Session的狀態(tài)保持是由web.config文件中的<system.web>標(biāo)記下的<sessionstate>標(biāo)記的mode屬性來(lái)決定的。該屬性有四種可能的值:Off、Inproc、StateServer和SQlServer.
?設(shè)為Off會(huì)禁用Session.
? Inproc是缺省的設(shè)置,這種模式和以前的ASP的會(huì)話狀態(tài)的方法是類似的,會(huì)話的狀態(tài)會(huì)被保存在ASP.NET進(jìn)程中,它的優(yōu)點(diǎn)是顯而易見(jiàn)的:性能。進(jìn)程內(nèi)的數(shù)據(jù)訪問(wèn)自然會(huì)比夸進(jìn)程的訪問(wèn)快。然而,這種方法Session的狀態(tài)依賴于ASP.NET進(jìn)程,當(dāng)IIS進(jìn)程崩潰或者正常重起啟時(shí),保存在進(jìn)程中的狀態(tài)將丟失。
?為了克服Inproc模式的缺點(diǎn),ASP.NET提供了兩種進(jìn)程外保持會(huì)話狀態(tài)的方法。
? ASP.NET首先提供了提供了一個(gè)Windows服務(wù):ASPState,這個(gè)服務(wù)啟動(dòng)后,ASP.NET應(yīng)用程序可以將mode屬性設(shè)置為“SateServer”,來(lái)使用這個(gè)Windows服務(wù)提供的狀態(tài)管理方法。
?除了在web.config文件中設(shè)置mode屬性為StateServer外,還必須設(shè)置運(yùn)行StateServer服務(wù)器的IP地址和端口號(hào).如果在IIS所在的機(jī)器運(yùn)行StateServer則IP地址就是127.0.0.1,端口號(hào)通常是42424.配置如下:
?mode=”StateServer”
?stateConnectionString="tcpip=127.0.0.1:42424"
? ? 使用這種模式,會(huì)話狀態(tài)的存儲(chǔ)將不依賴IIS進(jìn)程的失敗或者重啟,會(huì)話的狀態(tài)將存儲(chǔ)在StateServer進(jìn)程的內(nèi)存空間中。
? ?另一種會(huì)話狀態(tài)模式是SQLServer模式。這種模式是將會(huì)話的狀態(tài)保存在SQL Server數(shù)據(jù)庫(kù)中的。使用這種模式前,必須至少有一臺(tái)SQL Server服務(wù)器,并在服務(wù)器中建立需要的表和存儲(chǔ)過(guò)程。.NET SDK提供了兩個(gè)腳本來(lái)簡(jiǎn)化這個(gè)工作:InstallSqlState.sql和UnInstallSqlState.sql。這兩國(guó)文件存放在下面路徑中:
? <%SYSTEMDRIVER%>/Winnt/Microsoft.NET/Framework/<%version%>/
要配置SQL Server 服務(wù)器,可以在命令行中運(yùn)行SQL Server提供的命令行工具osql.exe
? osql -s [server name] -u [user] -p [password] <InstallSqlState.sql
例如:
? osql -s (local) -u as -p “”-i ?InstallSqlState.sql
做好必要的數(shù)據(jù)庫(kù)準(zhǔn)備工作后,將web.config文件中的sessionstate元素的mode屬性改為”sqlserver”,并指定SQL連接字符串。具體如下:
? mode="SQLServer"
? ? sqlConnectionString="data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes"
使用SQLServer模式處了可以使Session的狀態(tài)不依賴于IIS服務(wù)器之外,還可以利用SQL Server的集群,使?fàn)顟B(tài)存儲(chǔ)不依賴于單個(gè)的SQL Server,這樣就可以為應(yīng)用程序提供極大的可靠性。
?
2、丟失原因:
轉(zhuǎn)(1):Asp.net 默認(rèn)配置下,Session莫名丟失的原因及解決辦法
? ? ? 正常操作情況下Session會(huì)無(wú)故丟失。因?yàn)槌绦蚴窃诓煌5谋徊僮?#xff0c;排除Session超時(shí)的可能。另外,Session超時(shí)時(shí)間被設(shè)定成60分鐘,不會(huì)這么快就超時(shí)的。
? ? ? 這次到CSDN上搜了一下帖子,發(fā)現(xiàn)好多人在討論這個(gè)問(wèn)題,然后我又google了一下,發(fā)現(xiàn)微軟網(wǎng)站上也有類似的內(nèi)容。
現(xiàn)在我就把原因和解決辦法寫出來(lái)。
原因:
由于Asp.net程序是默認(rèn)配置,所以Web.Config文件中關(guān)于Session的設(shè)定如下:
<sessionState
mode='InProc'
stateConnectionString='tcpip=127.0.0.1:42424'
sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes'
cookieless='true'
timeout='60'/>
我們會(huì)發(fā)現(xiàn)sessionState標(biāo)簽中有個(gè)屬性mode,它可以有3種取值:InProc、StateServer?SQLServer(大小寫敏感)。默認(rèn)情況下是InProc,也就是將Session保存在進(jìn)程內(nèi)(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),這個(gè)進(jìn)程不穩(wěn)定,在某些事件發(fā)生時(shí),進(jìn)程會(huì)重起,所以造成了存儲(chǔ)在該進(jìn)程內(nèi)的Session丟失。
[asp的Session是具有進(jìn)程依賴性的。ASP Session狀態(tài)存于IIS的進(jìn)程中,也就是inetinfo.exe這個(gè)程序。所以當(dāng)inetinfo.exe進(jìn)程崩潰時(shí),這些信息也就丟失。]
哪些情況下該進(jìn)程會(huì)重起呢?微軟的一篇文章告訴了我們:
1、配置文件中processModel標(biāo)簽的memoryLimit屬性
2、Global.asax或者Web.config文件被更改
3、Bin文件夾中的Web程序(DLL)被修改
4、殺毒軟件掃描了一些.config文件。
更多的信息請(qǐng)參考PRB: Session variables are lost intermittently in ASP.NET applications
解決辦法:
? ? ? 前面說(shuō)到的sessionState標(biāo)簽中mode屬性可以有三個(gè)取值,除了InProc之外,還可以為StateServer、SQLServer。這兩種存Session的方法都是進(jìn)程外的,所以當(dāng)aspnet_wp.exe重起的時(shí)候,不會(huì)影響到Session。
? ? ? 現(xiàn)在請(qǐng)將mode設(shè)定為StateServer。StateServer是本機(jī)的一個(gè)服務(wù),可以在系統(tǒng)服務(wù)里看到服務(wù)名為ASP.NET State Service的服務(wù),默認(rèn)情況是不啟動(dòng)的。當(dāng)我們?cè)O(shè)定mode為StateServer之后,請(qǐng)手工將該服務(wù)啟動(dòng)。這樣,我們就能利用本機(jī)的StateService來(lái)存儲(chǔ)Session了,除非電腦重啟或者StateService崩掉,否則Session是不會(huì)丟的(因Session超時(shí)被丟棄是正常的)。
? ? ? 除此之外,我們還可以將Session通過(guò)其他電腦的StateService來(lái)保存[如使用狀態(tài)服務(wù)器]。具體的修改是這樣的。同樣還在sessionState標(biāo)簽中,有個(gè)stateConnectionString='tcpip=127.0.0.1:42424'屬性,其中有個(gè)ip地址,默認(rèn)為本機(jī)(127.0.0.1),你可以將其改成你所知的運(yùn)行了StateService服務(wù)的電腦IP,這樣就可以實(shí)現(xiàn)位于不同電腦上的Asp.net程序互通Session了。
? ? ? 如果你有更高的要求,需要在服務(wù)期重啟時(shí)Session也不丟失,可以考慮將mode設(shè)定成SQLServer,同樣需要修改sqlConnectionString屬性。關(guān)于使用SQLServer保存Session的操作,請(qǐng)?jiān)L問(wèn)這里。
? ? ? 在使用StateServer或者SQLServer存儲(chǔ)Session時(shí),所有需要保存到Session的對(duì)象除了基本數(shù)據(jù)類型(默認(rèn)的數(shù)據(jù)類型,如int、string等)外,都必須序列化。只需將[Serializable]標(biāo)簽放到要序列化的類前就可以了。
如:
[Serializable]
public class MyClass
{
? ? ......
}
具體的序列化相關(guān)的知識(shí)請(qǐng)參這里。
至此,問(wèn)題解決。
參考文章:
ASP.NET Session State FAQ
ASP.NET Session State
[ASP.NET] Session 詳解
PRB: Session Data Is Lost When You Use ASP.NET InProc Session State Mode
PRB: Session Data Is Lost When You Use ASP.NET InProc Session State Mode
ASP.NET HTTP 運(yùn)行時(shí)
.NET 中的對(duì)象序列化
備注
(1)使用 StateServer 模式
確保運(yùn)行 ASP.NET 狀態(tài)服務(wù)的服務(wù)器是要存儲(chǔ)會(huì)話狀態(tài)信息的遠(yuǎn)程服務(wù)器。該服務(wù)與 ASP.NET 一起安裝,其默認(rèn)位置為
<驅(qū)動(dòng)器>:/systemroot/Microsoft.NET/Framework/version/aspnet_state.exe。?
在應(yīng)用程序的 Web.config 文件中,
設(shè)置 mode=StateServer 并設(shè)置 stateConnectionString 屬性。
例如,stateConnectionString="tcpip=sarath:42424"。?
(2)使用 SQLServer 模式
在運(yùn)行 SQL Server 的計(jì)算機(jī)(它將存儲(chǔ)會(huì)話狀態(tài))上運(yùn)行 InstallSqlState.sql
(默認(rèn)的安裝位置為 <驅(qū)動(dòng)器>:/systemroot/Microsoft.NET/Framework/version)。
這將創(chuàng)建一個(gè)名為 ASPState 的數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)具有新的存儲(chǔ)過(guò)程并且在 TempDB 數(shù)據(jù)庫(kù)中具有 ASPStateTempApplications 表和 ASPStateTempSessions 表。
在應(yīng)用程序的 Web.config 文件中,設(shè)置 mode=SQLServer 并設(shè)置 sqlConnectionString 屬性。例如,sqlConnectionString="data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。?
(3)示例?
以下示例指定若干會(huì)話狀態(tài)配置設(shè)置。?
<configuration>?
<system.web>?
<sessionState mode="InProc"?
cookieless="true"?
timeout="20"/>?
</sessionState>?
</system.web>?
</configuration>?
要求?
包含于:<system.web>?
Web 平臺(tái):IIS 5.0、IIS 5.1、IIS 6.0?
配置文件:Machine.config、Web.config?
配置節(jié)處理程序:System.Web.SessionState.SessionStateSectionHandler?
請(qǐng)參見(jiàn)
ASP.NET 配置 | ASP.NET 設(shè)置架構(gòu) | SessionStateModule
作者: ?來(lái)源: ?(責(zé)任編輯:webjx)--- -------------收集之二---------------------------------
[出現(xiàn)原因:]在Windows2003的服務(wù)器中的IIS6加入了應(yīng)用程序池來(lái)回收一些無(wú)用的進(jìn)程的功能,當(dāng)由于網(wǎng)站程序的錯(cuò)誤或訪問(wèn)量太多的導(dǎo)致的應(yīng)用程序池會(huì)自動(dòng)回收該進(jìn)程,防止網(wǎng)站進(jìn)入“死機(jī)”狀態(tài),而這時(shí)候的應(yīng)用程序池的回收就會(huì)導(dǎo)致session變量被清除,就出現(xiàn)了session變量不見(jiàn)的現(xiàn)象。
為了解決這種在Windows2003下才出現(xiàn)的問(wèn)題,我們?cè)诜?wù)端起動(dòng)ASP.NET State Service服務(wù),并且在系統(tǒng)的machine.config做了一些改動(dòng)。現(xiàn)在默認(rèn)的情況下會(huì)話狀態(tài)mode是StateServer。如果您的網(wǎng)站根目錄下也配有一個(gè)web.config配置文件,請(qǐng)把mode="InProc"改成mode="StateServer",如下代碼,就可以防止session變量的丟失:
<sessionState?
mode="StateServer"?
stateConnectionString="tcpip=127.0.0.1:42424"?
sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI"?
cookieless="false"?
timeout="30"?
/>?
+ 注:只適用于支持asp.net的用戶。
?
轉(zhuǎn)(2):原因及一些解決之道
將Session保存在State Server里:
1.啟動(dòng)服務(wù)“ASP.NET State Service”,
2.然后,修改web.config:
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="140000"
/>
注意://mode="StateServer"這種模式下即使修改頁(yè)面也不會(huì)丟失session!
當(dāng)然:mode="InProc"如果你的模式為這種,修改頁(yè)面的時(shí)候會(huì)丟失session!!!!!!
在WebConfig里將Session的Mode設(shè)成SQLServer或者StateServer都不會(huì)丟Session的,
前者需要寫入數(shù)據(jù)庫(kù),后者需要系統(tǒng)開(kāi)StateServer服務(wù)。
?
原因1:
bin目錄中的文件被改寫,asp.net有一種機(jī)制,為了保證dll重新編譯之后,系統(tǒng)正常運(yùn)行,它會(huì)重新啟動(dòng)一次網(wǎng)站進(jìn)程,這時(shí)就會(huì)導(dǎo)致Session丟失,所以如果有access數(shù)據(jù)庫(kù)位于bin目錄,或者有其他文件被系統(tǒng)改寫,就會(huì)導(dǎo)致Session丟失。[目錄的刪除操作一定丟失session。asp.net的內(nèi)部機(jī)制對(duì)待目錄有點(diǎn)像個(gè)守財(cái)奴,它死守著目錄,你創(chuàng)建它不會(huì)管(往里加),一但創(chuàng)建他就會(huì)監(jiān)視該目錄,若你要?jiǎng)h除或重命名它的(動(dòng)它的目錄),它就發(fā)生重起了。。]
原因2:
文件夾選項(xiàng)中,如果沒(méi)有打開(kāi)“在單獨(dú)的進(jìn)程中打開(kāi)文件夾窗口”,一旦新建一個(gè)窗口,系統(tǒng)可能認(rèn)為是新的Session會(huì)話,而無(wú)法訪問(wèn)原來(lái)的Session,所以需要打開(kāi)該選項(xiàng),否則會(huì)導(dǎo)致Session丟失
原因3:
似乎大部分的Session丟失是客戶端引起的,所以要從客戶端下手,看看cookie有沒(méi)有打開(kāi)
原因4:
Session的時(shí)間設(shè)置是不是有問(wèn)題,會(huì)不會(huì)因?yàn)槌瑫r(shí)造成丟失。
[默認(rèn)時(shí)間是20分鐘,可以在Web.Config中設(shè)置Session的timeOut,如改為60分鐘等]
原因5:
IE中的cookie數(shù)量限制(每個(gè)域20個(gè)cookie)可能導(dǎo)致session丟失
原因6:
使用web garden模式,且使用了InProc mode作為保存session的方式
解決丟失的經(jīng)驗(yàn)
1. 判斷是不是原因1造成的,可以在每次刷新頁(yè)面的時(shí)候,跟蹤bin中某個(gè)文件的修改時(shí)間。
2. 做Session讀寫日志,每次讀寫Session都要記錄下來(lái),并且要記錄SessionID、Session值、所在頁(yè)面、當(dāng)前函數(shù)、函數(shù)中的第幾次Session操作,這樣找丟失的原因會(huì)方便很多
3. 如果允許的話,建議使用state server或sql server保存session,這樣不容易丟失
4. 在global.asa中加入代碼記錄Session的創(chuàng)建時(shí)間和結(jié)束時(shí)間,超時(shí)造成的Session丟失是可以在SessionEnd中記錄下來(lái)的。
5. 如果有些代碼中使用客戶端腳本,如javascript維護(hù)Session狀態(tài),就要嘗試調(diào)試腳本,是不是因?yàn)槟_本錯(cuò)誤引起Session丟失。
?
轉(zhuǎn)(3):Session丟失原因與解決方案小結(jié)
可能的原因1:
win2003 server下的IIS6默認(rèn)設(shè)置下對(duì)每個(gè)運(yùn)行在默認(rèn)應(yīng)用池中的工作者進(jìn)程都會(huì)經(jīng)過(guò)20多個(gè)小時(shí)后自動(dòng)回收該進(jìn)程,造成保存在該進(jìn)程中的session丟失。
因?yàn)镾ession,Application等數(shù)據(jù)默認(rèn)保存在運(yùn)行該Web應(yīng)用程序的工作者進(jìn)程中,如果回收工作者進(jìn)程,則會(huì)造成丟失。
解決辦法:
修改配置,設(shè)置為不定時(shí)自動(dòng)回收該工作者進(jìn)程,比如設(shè)置為當(dāng)超出占用現(xiàn)有物理內(nèi)存60%后自動(dòng)回收該進(jìn)程。通過(guò)使用默認(rèn)應(yīng)用程序池,可以確保多個(gè)應(yīng)用程序間互相隔離,保證由于一個(gè)應(yīng)用程序的崩潰不會(huì)影響另外的Web應(yīng)用程序。還可以使一個(gè)獨(dú)立的應(yīng)用程序運(yùn)行在一個(gè)指定的用戶帳號(hào)特權(quán)之下。如果使用StateServer方式或者Sql Server數(shù)據(jù)庫(kù)方式來(lái)保存Session,則不受該設(shè)置的影響。
可能的原因2:
系統(tǒng)要運(yùn)行在負(fù)載平衡的 Web 場(chǎng)環(huán)境中,而系統(tǒng)配置文件web.config中的Session狀態(tài)卻設(shè)置為InProc(即在本地存儲(chǔ)會(huì)話狀態(tài)),導(dǎo)至在用戶訪問(wèn)量大時(shí),Session常經(jīng)超時(shí)的情況。引起這個(gè)現(xiàn)象的原因主要是因?yàn)橛脩敉ㄟ^(guò)負(fù)載平衡IP來(lái)訪問(wèn)WEB應(yīng)用系統(tǒng),某段時(shí)候在某臺(tái)服務(wù)器保存了Session的會(huì)話狀態(tài),但在其它的WEB前端服務(wù)器中卻沒(méi)有保存Session的會(huì)話狀態(tài),而隨著并發(fā)量的增大,負(fù)載平衡會(huì)當(dāng)作路由隨時(shí)訪問(wèn)空閑的服務(wù)器,結(jié)果空閑的服務(wù)器并沒(méi)有之前保存的Session會(huì)話狀態(tài)。
解決辦法:?
1.當(dāng)您在負(fù)載平衡的 Web 場(chǎng)環(huán)境中運(yùn)行 ASP.NET Web 應(yīng)用程序時(shí),一定要使用 SqlServer 或 StateServer 會(huì)話狀態(tài)模式,在項(xiàng)目中我們基于性能考慮并沒(méi)有選擇SqlServer模式來(lái)存儲(chǔ)Session狀態(tài),而是選擇一臺(tái)SessionStateServer 服務(wù)器來(lái)用戶的Session會(huì)話狀態(tài)。我們要在系統(tǒng)配置文件web.config中設(shè)置如下:?
<sessionState
mode="StateServer" cookieless="false" timeout="240"
stateConnectionString="tcpip=192.168.0.1:42424" stateNetworkTimeout="14400" />
還要添加一項(xiàng)?
<machineKey
validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4" decryptionKey="5FC88DFC24EA123C" validation="SHA1"/> ?
2. 我們同時(shí)還要在SessionStateServer 服務(wù)器中啟動(dòng)ASP.NET State Service服務(wù),具體設(shè)置:控制面板>>管理工具>>服務(wù)>>ASP.NET State Service,把它設(shè)為自動(dòng)啟動(dòng)即可。?
3. 每臺(tái)前端WEB服務(wù)的Microsoft“Internet 信息服務(wù)”(IIS)設(shè)置?
? ? ? ? ? ? ?要在 Web 場(chǎng)中的不同 Web 服務(wù)器間維護(hù)會(huì)話狀態(tài),Microsoft“Internet 信息服務(wù)”(IIS) 配置數(shù)據(jù)庫(kù)中 Web 站點(diǎn)的應(yīng)用程序路徑(例如,/LM/W3SVC/2)與 Web 場(chǎng)中所有 Web 服務(wù)器必須相同。大小寫也必須相同,因?yàn)閼?yīng)用程序路徑是區(qū)分大小寫的。在一臺(tái) Web 服務(wù)器上,承載 ASP.NET應(yīng)用程序的 Web 站點(diǎn)的實(shí)例 ID 可能是 2(其中應(yīng)用程序路徑是 /LM/W3SVC/2)。在另一臺(tái) Web 服務(wù)器上,Web 站點(diǎn)的實(shí)例 ID 可能是 3(其中應(yīng)用程序路徑是 /LM/W3SVC/3)。因此,Web 場(chǎng)中的 Web 服務(wù)器之間的應(yīng)用程序路徑是不同的。我們必須使Web 場(chǎng)Web 站點(diǎn)的實(shí)例 ID 相同即可。你可以在IIS中把某一個(gè)WEB配置信息保存為一個(gè)文件,其他Web 服務(wù)器的IIS配置可以來(lái)自這一個(gè)文件。您如果想知道具體的設(shè)置請(qǐng)?jiān)L問(wèn)Microsoft Support網(wǎng)站:
?
轉(zhuǎn)(4):丟失問(wèn)題集錦
SessionState 的Timeout),其主要原因有三種。
一:有些殺病毒軟件會(huì)去掃描您的Web.Config文件,那時(shí)Session肯定掉,這是微軟的說(shuō)法。
二:程序內(nèi)部里有讓Session掉失的代碼,及服務(wù)器內(nèi)存不足產(chǎn)生的。
三:程序有框架頁(yè)面和跨域情況。
第一種解決辦法是:使殺病毒軟件屏蔽掃描Web.Config文件(程序運(yùn)行時(shí)自己也不要去編輯它)
第二種是檢查代碼有無(wú)Session.Abandon()之類的。
第三種是在Window服務(wù)中將ASP.NET State Service 啟動(dòng)。
http://community.csdn.net/Expert/topic/3100/3100218.xml?temp=.4426386
還有可能就是你在測(cè)試期間改動(dòng)了,網(wǎng)站的文件。
下面是幫助中的內(nèi)容:
(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconsessionstate.htm)
ASP.NET 提供一個(gè)簡(jiǎn)單、易于使用的會(huì)話狀態(tài)模型,您可以使用該模型跨多個(gè) Web 請(qǐng)求存儲(chǔ)任意數(shù)據(jù)和對(duì)象。
它使用基于字典的、內(nèi)存中的對(duì)象引用(這些對(duì)象引用存在于 IIS 進(jìn)程中)緩存來(lái)完成該操作。
使用進(jìn)程內(nèi)會(huì)話狀態(tài)模式時(shí)請(qǐng)考慮下面的限制:
使用進(jìn)程內(nèi)會(huì)話狀態(tài)模式時(shí),如果 aspnet_wp.exe 或應(yīng)用程序域重新啟動(dòng),則會(huì)話狀態(tài)數(shù)據(jù)將丟失。這些重新啟動(dòng)通常會(huì)在下面的情況中發(fā)生:
(1)在應(yīng)用程序的 Web.config 文件的 <processModel> 元素中,設(shè)置一個(gè)導(dǎo)致新進(jìn)程在條件被滿足時(shí)啟動(dòng)的屬性,例如 memoryLimit。
(2)修改 Global.asax 或 Web.config 文件。
(3)更改到 Web 應(yīng)用程序的 /Bin 目錄。
(4)用殺毒軟件掃描并修改 Global.asax 文件、Web.config 文件或 Web 應(yīng)用程序的 /Bin 目錄下的文件。
(5)如果在應(yīng)用程序的 Web.config 文件的 <processModel> 元素中啟用了網(wǎng)絡(luò)園模式,請(qǐng)不要使用進(jìn)程內(nèi)會(huì)話狀態(tài)模式。否則將發(fā)生隨機(jī)數(shù)據(jù)丟失。
?
我也碰到過(guò)。本機(jī)器上的Session或者Cookie丟失。
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="40"
/>
mode=""的三個(gè)屬性。本地/其他機(jī)器/sqlserver。
很多網(wǎng)絡(luò)架構(gòu),各個(gè)服務(wù)器之間都是通過(guò)一臺(tái)專門保存狀態(tài)的服務(wù)器(專門的狀態(tài)服務(wù)器)來(lái)保存比如說(shuō)session,cookie..
?
我以前遇到這種問(wèn)題,我用了以下幾個(gè)方法來(lái)解決。現(xiàn)在也沒(méi)有這種情況發(fā)生了。
1、release,不要debug發(fā)布。
2、<sessionState cookieless="true" 把cookieless設(shè)為true。因?yàn)榭蛻舳私胏ookie時(shí),session也無(wú)效。
3、在IIS中把Session過(guò)期時(shí)間延長(zhǎng)。
4、讓殺毒軟件不掃描bin文件夾下的文件和Web.Config文件。
以上我是不明不白的做的。不過(guò)Session正常使用了!呵呵~~我幸運(yùn)!
?
沒(méi)啥好講的,不要用Session好了,直接用Forms認(rèn)證把,
我前兩天的系統(tǒng)就是用這個(gè)搞定的,覺(jué)得挺好的。
剛碰到一個(gè)類似的問(wèn)題:在使用frameset的時(shí)候,session變量丟失。
在微軟的網(wǎng)站上找到了解決的方法
http://support.microsoft.com/kb/323752/EN-US/
不知道是否有用?
IIS--->>應(yīng)用程序連接池--->>屬性---->>[回收][性能][運(yùn)行狀況]里的各項(xiàng)參數(shù)盡量都往大的改^_^),我不知道改拉那個(gè)才對(duì)的,反正我改完后所有的session都好拉.客戶的網(wǎng)站和動(dòng)網(wǎng)論壇的后臺(tái)也跟著好拉。
?
轉(zhuǎn)(5): 模態(tài)窗口中打開(kāi)新窗口的session丟失
? ? ? ? ?一直被這個(gè)問(wèn)題郁悶。在窗口A中使用showModalDialog()打開(kāi)了一個(gè)新的模態(tài)窗口B。然后在B窗口中進(jìn)行一些業(yè)務(wù)操作,最后還需要根據(jù)業(yè)務(wù)操作打印一些表單,結(jié)果此時(shí)在B中調(diào)用open()方法就會(huì)出現(xiàn)session丟失的現(xiàn)象,提示用戶重新登陸。
? ? ? ? ?兩天來(lái)一直沒(méi)頭蒼蠅一樣不停的試驗(yàn)各種方法。如果在這個(gè)窗口中采用打開(kāi)非模態(tài)對(duì)話框的打開(kāi)方法showModelessDialog()就沒(méi)有任何問(wèn)題,但是直接使用open()方法就是不能達(dá)到想要的效果。在網(wǎng)上不停的google,到各大bbs尋找解答,提供的都是最簡(jiǎn)單的應(yīng)用。好不容易找到一篇文章,其中提到session對(duì)象的有效范圍,卻也沒(méi)有具體提到我遇到的問(wèn)題:
IE中:
有效的窗品包括
? ? ? ? ?1.Session對(duì)象只在建立Session對(duì)象的窗口中有效。
? ? ? ? ?2.在建立Session對(duì)象的窗口中新開(kāi)鏈接的窗口
無(wú)效的窗口包括
? ? ? ? ?1.直接啟動(dòng)IE瀏覽器的窗口
? ? ? ? ?2.不是在建立Session對(duì)象的窗口中新開(kāi)鏈接的窗口。(即作者在建立Session對(duì)象的A窗口彈出的B窗口上調(diào)用了open()方法。)
考慮只在建立session對(duì)象的窗口中有效,于是就在子窗口中重新使用session.setAttribute()方法,以為如此就可以成功,結(jié)果還是不行,郁悶。
? ? ? ? ?早上起來(lái)突然來(lái)了靈感,既然子窗口中造成了session丟失,在父窗口中是無(wú)論如何還存在著session的變量的,我可以不必在子窗口中重新設(shè)置session變量,而可以直接調(diào)用父窗口的javascript函數(shù)open()方法可能會(huì)到目的吧。不管如何先試試,結(jié)果果然如此。 ? ? ?很多時(shí)候問(wèn)題就是這樣的,想要偷懶,于是不自己鉆研,到處尋求解答,最后還是得靠自己來(lái)搞定。
========
ASP.NET一般處理程序訪問(wèn)Session問(wèn)題
https://www.cnblogs.com/yunfeifei/p/3674832.html
我們?cè)谑褂靡话闾幚沓绦虻臅r(shí)候,訪問(wèn)Session會(huì)出現(xiàn)如下錯(cuò)誤:
解決方案如下:
//引用命名空間
using System.Web.SessionState;
//繼承IRequiresSessionState接口,擁有Session的讀寫權(quán)限
//繼承IReadOnlySessionState接口,擁有Session的只讀權(quán)限
public class Handler1 : IHttpHandler,IRequiresSessionState
? ? {
? ? ? ? public void ProcessRequest(HttpContext context)
? ? ? ? {
? ? ? ? ? ? context.Response.ContentType = "text/plain";
? ? ? ? ? ? context.Response.Write("Hello World");
? ? ? ? }
? ? ? ? public bool IsReusable
? ? ? ? {
? ? ? ? ? ? get
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? }
? ? }
========
?
總結(jié)
以上是生活随笔為你收集整理的Asp.Net Session学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VC++ 单文档项目显示打开的文件
- 下一篇: asp.net 表单总结