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