ASP(Active Server Pages)技術(shù)的Session對(duì)象用于存儲(chǔ)用戶在對(duì)話期間的私有信息。當(dāng)前用戶的Session對(duì)象中定義的變量和對(duì)象能在頁(yè)面之間共享,但是不能為應(yīng)用中其他用戶所訪問(wèn),因此在用ASP開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用程序時(shí),可以利用Session對(duì)象保存和跟蹤用戶的狀態(tài)信息。
Session對(duì)象有一個(gè)十分重要的屬性:Timeout,它用于設(shè)置在會(huì)話資源被釋放前,會(huì)話對(duì)象所能保持非活動(dòng)狀態(tài)的時(shí)間(默認(rèn)值為20分鐘)。當(dāng)Timeout屬性設(shè)置的時(shí)間值耗盡后,會(huì)話資源將被釋放。通過(guò)Timeout屬性破壞Session對(duì)象,避免了Session對(duì)象在服務(wù)器中無(wú)限制地產(chǎn)生,保護(hù)了服務(wù)器資源。
1、設(shè)置網(wǎng)站的應(yīng)用程序配置2、設(shè)置ASP.NET中的配置,修改webconfig文件。(也可以通過(guò)代碼添加)web.config 的 system.web 里添加如下配置項(xiàng):
< httpRuntime
executionTimeout="30"
/>3、Session儲(chǔ)存的位置絕對(duì)不在客戶端。Session儲(chǔ)存方式有三種,可在web.config中設(shè)置。
InProc模式,這種模式下Session保存在ASP.NET的進(jìn)程內(nèi),是一個(gè)內(nèi)部容器,在同一個(gè)應(yīng)用程序目錄是共享的,但是如果這個(gè)進(jìn)程被Web服務(wù)器回收,則Session就會(huì)丟失,所以這種模式很不穩(wěn)定。
StateServer模式,這種模式下Session被保存在一個(gè)Windows Service的進(jìn)程內(nèi),Windows Service的進(jìn)程比ASP.NET的進(jìn)程穩(wěn)定得多,只要開(kāi)啟這個(gè)服務(wù)的電腦不當(dāng)機(jī),一般來(lái)說(shuō)都是比較穩(wěn)定的。
SQL Server模式,這種模式就更進(jìn)一步,將Session保存到了數(shù)據(jù)庫(kù)中,通過(guò)犧牲效率換取穩(wěn)定。也可通過(guò)ASP.NET配置設(shè)置4、存儲(chǔ)的類型和大???
一般來(lái)說(shuō),InProc模式下,Session對(duì)儲(chǔ)存的對(duì)象沒(méi)有任何限制。而在StateServer和SQL Server模式中,由于Session需要跨進(jìn)程保持,所以要求所儲(chǔ)存對(duì)象的類型必須是可序列化的。雖然Session對(duì)所儲(chǔ)存的數(shù)據(jù)大小沒(méi)有什么限制,但不建議在Session中儲(chǔ)存太多的東西。5、生命周期是怎么樣的?
正常情況下Session在新的客戶端第一次訪問(wèn)頁(yè)面時(shí)創(chuàng)建,在超過(guò)超時(shí)時(shí)間沒(méi)有任何頁(yè)面訪問(wèn)后銷毀。6、常見(jiàn)的訪問(wèn)方法
一般來(lái)說(shuō)Session這種公用容器需要為期專門撰寫訪問(wèn)類,而不應(yīng)直接訪問(wèn)。
一個(gè)簡(jiǎn)單的訪問(wèn)類可能看起來(lái)是這樣的:public MyContext
{
public static MyContext Current
{
get { return HttpContext.Current.Session["hnop"] as MyContext; }
set { HttpContext.Current.Session["hnop"] = value; }
}
}
7、比較
Session的特點(diǎn)很突出,就是他與客戶端有關(guān),一般來(lái)說(shuō)只要客戶端不關(guān)閉瀏覽器,那么他訪問(wèn)的所有的頁(yè)面所獲得的都是同一個(gè)Session容器。我們可以往Session中放入用戶相關(guān)的信息,如登陸信息。但要注意的是,Session是一個(gè)公共容器,所以他里面的信息可以被任何運(yùn)行在服務(wù)器上的代碼所修改。
===========================================================================================================
ASP.Net中的Session
如果用戶關(guān)閉了Cookie,Session的值一樣也可以被保存。
config.web文件進(jìn)行一些配制,因?yàn)樵谄渲姓业疥P(guān)于Session的設(shè)置文本,如:
<sessionstate cookieless="false" />
把cookieless="false" 改成cookieless="true" ,那么以后Session就不儲(chǔ)存在cookies中了,而在儲(chǔ)存在URL中。
Session還能在另外一臺(tái)主機(jī)上保持:把localhost改成您要的主機(jī)
<sessionstate inproc="false" server="localhost" port="42424" />
===========================================================================================================
摘錄自:http://www.lslnet.com/linux/docs/linux-4141.htm
Application狀態(tài)為應(yīng)用程序提供了一個(gè)全局的狀態(tài)。所有客戶都可以使用該狀態(tài)。從設(shè)計(jì)的角度來(lái)說(shuō),我們通常用Application來(lái)存儲(chǔ)一些標(biāo)準(zhǔn)的數(shù)據(jù)。同時(shí),我們?cè)谑褂盟鼤r(shí)要注意避免性能的降低,存儲(chǔ)的數(shù)據(jù)盡可能提供給客戶只讀的功能。
我們可以使用HttpApplication類的Application屬性來(lái)訪問(wèn)Application狀態(tài),它返回一個(gè)HttpApplicationState類的實(shí)例。這個(gè)類是一個(gè)對(duì)象集合,可以存儲(chǔ)任何類型的數(shù)據(jù),并以鍵/值對(duì)的形式存儲(chǔ)。一旦數(shù)據(jù)被存儲(chǔ)到狀態(tài)后,就不會(huì)刪除,除非應(yīng)用程序重新啟動(dòng)或者被終止或回收。
我們可以在Global.asax的Application_Start函數(shù)中存儲(chǔ)數(shù)據(jù): void Application_Start(object src, EventArgs e) { int exp = 0; // population of dataset from ADO.NET query not shown // Cache DataSet reference Application["Experiment"] = exp; }
現(xiàn)在你可以在任意頁(yè)面下使用它:
private void Page_Load(object src, EventArgs e) { int expr = Int32.Parse((Application["Experiment"])); }
由于Application狀態(tài)對(duì)于所有客戶都是共享的,如果客戶只是讀取該數(shù)據(jù),則沒(méi)有什么問(wèn)題,一旦要進(jìn)行寫操作,就不能保證線程的安全以及出現(xiàn)同步爭(zhēng)用的問(wèn)題。我們可以使用HttpApplicationStateLock類,它派生于ReadWriteObjectLock類,它提供了讀/寫鎖的兩種屬性。在ASP.Net下,隱式地調(diào)用了AcquireWrite()和AcquireRead()方法以保證避免上面的問(wèn)題。當(dāng)然,我們也可以顯示地使用Lock()和Unlock():
private void Page_Load(object sender, System.EventArgs e) { Application.Lock(); int expr = Int32.Parse((Application["Experiment"])); if (expr>=something) { //do something } Else { //do something else } Application.UnLock(); //Some other thing goes here }
session,cookie,view狀態(tài)都是用來(lái)保存客戶端信息的。它們之間又有什么區(qū)別呢?
Session狀態(tài)是在客戶登錄的時(shí)候創(chuàng)建的,它保存了客戶特定的信息,并以Session ID來(lái)標(biāo)識(shí)。當(dāng)一個(gè)新客戶訪問(wèn)應(yīng)用程序時(shí),先生成一個(gè)新的Session ID(或是Session Key),并為同一個(gè)客戶接下來(lái)的請(qǐng)求創(chuàng)建聯(lián)系。你可以在Session State中存儲(chǔ)任意類型的數(shù)據(jù),作為你的應(yīng)用,狀態(tài)被同一個(gè)進(jìn)程和AppDomain(App域)維護(hù)。Session State的特點(diǎn)是為每一個(gè)特定的客戶創(chuàng)建狀態(tài)以維護(hù)客戶的信息,這些狀態(tài)信息存儲(chǔ)在服務(wù)器端的默認(rèn)的會(huì)話狀態(tài)配置中。
Session(“Value”) = expr ; // Storing the data into session object SomeFunction() { int expr = Int32.Parse(Session(“Value”));//Accessing from it if (expr>=something) { //do something } Else { //do something else } //Some other thing goes here }
既然Session State針對(duì)特定的客戶建立,通過(guò)它來(lái)識(shí)別客戶的請(qǐng)求。Asp.Net提供了一種加密機(jī)制和編碼算法生成自己的Session Key。這是非常必要的,因?yàn)橹懒四愕腟ession Key,就有權(quán)限訪問(wèn)指定的頁(yè)面了。
在ASP.Net中生成Session Key的方法:
byte[] sessionkey = new byte[15];
//Generates a random number RNGCryptoServiceProvider rngkey = new RNGCryptoServiceProvider (); rngkey.GetBytes (sessionkey); string clientsessionKey = SessionId.Encode (sessionkey);
但是Session和客戶端的Cookie是有關(guān)的,當(dāng)客戶關(guān)掉Cookie時(shí),Session就失效了。不過(guò)在ASP.Net 中可以在web.config中修改設(shè)置,使Session的傳遞脫離Cookie。方法是:
對(duì)于Cookie大家并不陌生,每個(gè)Cookie存儲(chǔ)了多個(gè)名/值對(duì),我們可以通過(guò)HttpCookie類的值集合來(lái)訪問(wèn)它,也可以間接地通過(guò)類所提供的索引器訪問(wèn)。Cookie在ASP.Net下的使用: protected void Page_Load(Object sender, EventArgs E) { int expr = 0; if (Request.Cookies["Expr"] == null) { // "Expr" cookie not set, set with this response HttpCookie cokExpr = new HttpCookie("Expr"); cokExpr.Value = exprTextBox.Text; Response.Cookies.Add(cokExpr); expr = Convert.ToInt32(exprTextBox.Text); } else { // use existing cookie value... expr = Convert.ToInt32(Request.Cookies["Expr"].Value); } // use expr to customize page }
由于Cookie存儲(chǔ)的信息是放到客戶端的,用戶在訪問(wèn)服務(wù)器端頁(yè)面時(shí),必然在客戶端和服務(wù)器端之間頻繁交換信息,影響了程序的性能。而Session由于存儲(chǔ)在服務(wù)器內(nèi)存中,因此不存在這個(gè)問(wèn)題。不過(guò),Session存儲(chǔ)的信息是臨時(shí)的,用戶一旦關(guān)閉瀏覽器,狀態(tài)即失去。而Cookie則相反。
至于View State,主要是指控件和頁(yè)面的狀態(tài)信息,它以_VIEWSTATE值傳遞給服務(wù)器端。有興趣的可以看我另外一篇文章:ASP.Net中控件的EnableViewState屬性
Application、Session和Cookie,可以借用Carfield的總結(jié):
COOKIE 是本地文件,是 40 大盜在阿里巴巴家做的記號(hào),或者是送牛奶的人在你家門口釘?shù)南渥印?/p>
SESSION 是服務(wù)器端內(nèi)存,是你洗澡時(shí)浴池發(fā)給你的鑰匙。自己專用,可以開(kāi)自己的好多箱子。
APPLICATION 是公共浴池。在這里能看見(jiàn)所有人,包括 ppmm 哦:)。
.Net WebService(也包括一般意義的 HttpWebRequest) 超時(shí)設(shè)置
1. 服務(wù)器端設(shè)置超時(shí)
在 web.config 的 system.web 里添加如下配置項(xiàng):
< httpRuntime
executionTimeout="30"
/>
以上時(shí)間單位是秒.
記得要把 web.config 的 debug 模式關(guān)閉:
< compilation
defaultLanguage="c#"
debug="false"
/>
如果 debug 模式?jīng)]有關(guān)閉, executionTimeout 會(huì)被忽略. 這時(shí)候, 如果應(yīng)用是在單步跟蹤的模式下, 根據(jù)經(jīng)驗(yàn), 超時(shí)時(shí)間大約是 90 秒(在 machine.config 里設(shè)置的, 我猜的^_^), 如果不是在單步跟蹤的模式下, 超時(shí)時(shí)間可能是 20 分鐘(也是我猜的, 因?yàn)槠?session 的缺省超時(shí)時(shí)間是 20 分鐘, 哈). 我懶得找微軟的文檔作進(jìn)一步的求證了, 反正我用不著知道 debug 模式下的確切超時(shí)時(shí)間.
2. 客戶端設(shè)置超時(shí)
在 WebService 的客戶端代理程序(用 wsdl.exe 生成)里設(shè)置 Request 超時(shí)時(shí)間, 單位是毫秒:
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest wr = (HttpWebRequest)base.GetWebRequest( uri );
wr.Timeout = 30*1000;
return wr;
}
從同一個(gè)頁(yè)面?zhèn)鞯搅硪粋€(gè)頁(yè)面才能延續(xù)同一個(gè)session,也就是說(shuō)session不可跨域,同時(shí)客戶端一關(guān)閉瀏覽器或一關(guān)閉瀏覽頁(yè) Session也消失了,再次訪問(wèn)時(shí)又會(huì)創(chuàng)建新的Session 但還會(huì)在服務(wù)器上存活等待超時(shí),只是調(diào)用不到了. 另外比如在第一個(gè)頁(yè)面置了SESSION,然后REDIRECT去第二個(gè)頁(yè)面。解決方法是在REDIRECT中設(shè)置endResponse為FALSE。
Iframe丟Session的原因:session是客戶端和服務(wù)器端共同認(rèn)證的,客戶端存儲(chǔ)標(biāo)識(shí),通過(guò)附加在頁(yè)面的頭發(fā)送給服務(wù)器端,服務(wù)器進(jìn)行識(shí)別,如果符合條件就可以獲得相應(yīng)的session操作權(quán)。
聯(lián)系客服