在ASP.NET中使用Session常見(jiàn)問(wèn)題集錦
在壇子里經(jīng)??吹揭恍╆P(guān)于Session的問(wèn)題,下面做一個(gè)總結(jié),希望對(duì)大家有所幫助:
問(wèn):為什么Session在有些機(jī)器上偶爾會(huì)丟失?
答:可能和機(jī)器的環(huán)境有關(guān)系,比如:防火墻或者殺毒軟件等,嘗試關(guān)閉防火墻。
問(wèn):為什么當(dāng)調(diào)用Session.Abandon時(shí)并沒(méi)有激發(fā)Session_End方法?
答:首先Session_End方法只支持InProc(進(jìn)程內(nèi)的)類型的Session。其次要激發(fā)Session_End方法,必須存在Session(即系統(tǒng)中已經(jīng)使用Session了),并且至少要完成一次請(qǐng)求(在這次請(qǐng)求中會(huì)調(diào)用該方法)。
問(wèn):為什么當(dāng)我在InProc模式下使用Session會(huì)經(jīng)常丟失?
答:該問(wèn)題通常是由于應(yīng)用程序被回收導(dǎo)致的,因?yàn)楫?dāng)使用進(jìn)程內(nèi)Session時(shí),Session是保存在aspnet_wp進(jìn)程中,當(dāng)該進(jìn)程被回收Session自然也就沒(méi)有了,確定該進(jìn)程是否被回收可以通過(guò)查看系統(tǒng)的事件查看器獲得信息。
具體信息請(qǐng)參考:
Session variables are lost intermittently in ASP.NET applications
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
在1.0的時(shí)候也有一個(gè)bug會(huì)導(dǎo)致工作進(jìn)程被回收并重啟,該bug已經(jīng)在1.1和sp2中修復(fù)。
關(guān)于該bug的詳細(xì)信息請(qǐng)參考:
ASP.NET Worker Process (Aspnet_wp.exe) Is Recycled Unexpectedly.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792
問(wèn):為什么當(dāng)Session超時(shí)或者Abandoned后,新Session的ID和原來(lái)的相同?
答:因?yàn)镾essionID是保存在客戶端瀏覽器的實(shí)例里,當(dāng)Session超時(shí)在服務(wù)器重新建立Session時(shí),將使用瀏覽器傳來(lái)的SessionID,所以當(dāng)Session超時(shí)后,再重新建立后SessionID并不變。
問(wèn):為什么每次請(qǐng)求的SessionID都不相同?
答:該問(wèn)題可能是沒(méi)有在Session里面保存任何信息引起的,即程序中任何地方都沒(méi)有使用Session。當(dāng)Session中保存信息之后SessionID將一直和瀏覽器相關(guān),此時(shí)的SessionID將不會(huì)在變化。
問(wèn):ASP和ASP.NET之間是否可以共享Session?
答:可以。但是這是一個(gè)比較復(fù)雜的過(guò)程,微軟提供了官方的解決方案,請(qǐng)參考:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET.asp
問(wèn):什么類型的對(duì)象可以保存在Session里?
答:這依賴使用的Session的模式,當(dāng)使用的是進(jìn)程內(nèi)(InProc)的Session那么可以輕松的保存任何對(duì)象。如果你使用了非InProc的模式,則只能保存可以序列化和反序列化的對(duì)象,如果此時(shí)保存的對(duì)象不支持序列化,則不能保存到這種模式(非InProc)的Session里。
問(wèn):為什么在Session_End中不能使用Response.Redirect和Server.Transfer方法跳轉(zhuǎn)頁(yè)面?
答:Session_End是一個(gè)在服務(wù)器內(nèi)部激發(fā)的事件處理函數(shù)。它是基于一個(gè)服務(wù)器內(nèi)部的計(jì)時(shí)器的,在激發(fā)該事件時(shí)服務(wù)器上并沒(méi)有相關(guān)的HttpRequest對(duì)象,因此此時(shí)并不能使用Response.Redirect和Server.Transfer方法。
問(wèn):在Session_End中是否可以獲得HttpContext對(duì)象?
答:不行,因?yàn)檫@個(gè)事件并沒(méi)有和任何的請(qǐng)求(Request)相關(guān)聯(lián),沒(méi)有基于請(qǐng)求的上下文。
問(wèn):在Web Service中該如何使用Session?
答:為了在Web Service中使用Session,需要在Web Service的調(diào)用方做一些額外的工作,必須保存和存儲(chǔ)調(diào)用Web Service時(shí)使用的Cookie。詳細(xì)信息請(qǐng)參考MSDN文檔的HttpWebClientProtocol.CookieContainer屬性。然而,如果你使用代理服務(wù)器訪問(wèn)Web Service由于框架的限制,兩者不能共享Session。
問(wèn):在自定義自己的HttpHandler的時(shí)候,為什么不能使用Session?
答:在實(shí)現(xiàn)自己的HttpHandler的時(shí)候,如果希望使用Session必須實(shí)現(xiàn)下面的兩個(gè)標(biāo)記接口中的一個(gè):IRequiresSessionState和IReadOnlySessionState,這些接口沒(méi)有任何方法需要實(shí)現(xiàn),只是一個(gè)標(biāo)記接口和使用INamingContainer接口的方法一樣。
問(wèn):當(dāng)我使用webfarm時(shí),當(dāng)我重定向到其他的Web服務(wù)器時(shí)Session為什么會(huì)丟失?
答:詳細(xì)信息請(qǐng)參考:
PRB: Session State Is Lost in Web Farm If You Use SqlServer or StateServer Session Mode
http://support.microsoft.com/default.aspx?scid=kb;en-us;325056
問(wèn):為什么我的Session在Application_OnAcquireRequestState方法中無(wú)效?
答:Session只有在HttpApplication.AcquireRequestState事件調(diào)用以后才會(huì)有效。
詳細(xì)信息請(qǐng)參考:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhandlingpublicevents.asp
問(wèn):如果使用了cookieless,我該如何從HTTP頁(yè)面定向到HTTPS?
答:請(qǐng)嘗試下面的方法:
String originalUrl = "/fxtest3/sub/foo2.aspx";
String modifiedUrl = "https://localhost" + Response.ApplyAppPathModifier(originalUrl);
Response.Redirect(modifiedUrl);
問(wèn):Session在global.asax中的那些事件中有效?
答:Session只有在AcquireRequestState事件之后有效,該事件之后的事件都可以使用Session。
問(wèn):如何獲得當(dāng)前Session中保存的所有對(duì)象?
答:可以通過(guò)遍歷所有的Session.Keys來(lái)獲得。代碼如下:
ArrayList sessionCollection = new ArrayList();
foreach (string strKey in Session.Keys){
sessionCollection.Add(Session[strKey]);
}
問(wèn):是否可以在不同的應(yīng)用程序中共享Session?
答:不能直接共享??梢詤⒖既绾卧贏SP和ASP.NET之間共享Session。
問(wèn):Session.Abandon和Session.Clear有何不同?
答:主要的不同之處在于當(dāng)使用Session.Abandon時(shí),會(huì)調(diào)用Session_End方法(InProc模式下)。當(dāng)下一個(gè)請(qǐng)求到來(lái)時(shí)將激發(fā)Session_Start方法。而Session.Clear只是清除Session中的所有數(shù)據(jù)并不會(huì)中止該Session,因此也不會(huì)調(diào)用那些方法。
問(wèn):為了可以順序訪問(wèn)Session的狀態(tài)值,Session是否提供了鎖定機(jī)制?
答:Session實(shí)現(xiàn)了Reader/Writer的鎖機(jī)制:
當(dāng)頁(yè)面對(duì)Session具有可寫(xiě)功能(即頁(yè)面有<%@ Page EnableSessionState="True" %>標(biāo)記),此時(shí)直到請(qǐng)求完成該頁(yè)面的Session持有一個(gè)寫(xiě)鎖定。
當(dāng)頁(yè)面對(duì)Session具有只讀功能(即頁(yè)面有<%@ Page EnableSessionState="ReadOnly" %>標(biāo)記),此時(shí)知道請(qǐng)求完成該頁(yè)面的Session持有一個(gè)讀鎖定。
讀鎖定將阻塞一個(gè)寫(xiě)鎖定;讀鎖定不會(huì)阻塞讀鎖定;寫(xiě)鎖定將阻塞所有的讀寫(xiě)鎖定。這就是為什么兩個(gè)框架中的同一個(gè)頁(yè)面都去寫(xiě)同一個(gè)Session時(shí),其中一個(gè)要等待另一個(gè)(稍快的那個(gè))完成后,才開(kāi)始寫(xiě)。
問(wèn):Session平滑超時(shí)意味著什么?
答:Session平滑超時(shí)意味著只要你的頁(yè)面訪問(wèn)(使用)了Session,超時(shí)時(shí)間將被刷新(可以理解為重新計(jì)時(shí)),即從該頁(yè)面請(qǐng)求開(kāi)始,將重新計(jì)算超時(shí)時(shí)間。但是,該頁(yè)面不能禁用Session。它會(huì)自動(dòng)的訪問(wèn)當(dāng)前頁(yè)面的Session,刷新超時(shí)時(shí)間。
問(wèn):在global.asax中的事件處理函數(shù)中Session為什么無(wú)效?
答:依賴于在哪個(gè)事件處理函數(shù)中使用Session,Session在AcquireRequestState事件之后才有效,該事件之后的所有事件處理函數(shù)都可以使用Session,之前的則不能。
問(wèn):當(dāng)我寫(xiě)一個(gè)依賴于當(dāng)前應(yīng)用的Session的組件時(shí),為什么不能直接使用Session["Key"]獲得其值?
答:Session["Key"]實(shí)際上是this.Session["Key"],它是作為Page的一個(gè)屬性提供的,所以在你的組件中不能直接使用這個(gè)屬性。你可以通過(guò)下面的方式使用Session:
HttpContext.Current.Session["Key"] = "My Seesion Value";
問(wèn):當(dāng)我使用InProc模式保存Session時(shí),此時(shí)的Session是保存在哪里?
答:不同的IIS的處理方式不同,
當(dāng)使用的是IIS5的時(shí)候Session是保存在aspnet_wp.exe的進(jìn)程空間里的。
當(dāng)使用的是IIS6時(shí),默認(rèn)情況下所有的應(yīng)用程序共享應(yīng)用程序池,Session保存在w3wp.exe的進(jìn)程空間中。
問(wèn):Session的超時(shí)設(shè)置是分鐘還是秒?
答:是分鐘,默認(rèn)為20分鐘。
問(wèn):當(dāng)頁(yè)面出現(xiàn)錯(cuò)誤后我的Session是否將被保存?我需要在Session_End中處理一些清理工作,但是失敗了,為什么?
答:Session_End只有在Session運(yùn)行在InProc模式下才會(huì)被執(zhí)行。Session_End使用的帳號(hào)是運(yùn)行aspnet_wp工作進(jìn)程的帳號(hào)(這個(gè)可以在machine.config中設(shè)置)。因此,如果在Session_End方法里,使用集成安全性鏈接到SQL,它將使用aspnet_wp進(jìn)程的帳號(hào)打開(kāi)鏈接,此時(shí)成功與否則依賴于你的SQL的安全性設(shè)置。
問(wèn):為什么當(dāng)我設(shè)置cookieless為true是我在重定向的時(shí)候會(huì)丟失Session?
答:當(dāng)使用cookieless時(shí),你必須使用相對(duì)路徑替換程序中的絕對(duì)路徑,如果使用絕對(duì)路徑ASP.NET將無(wú)法在URL中保存SessionID。
例如:將\myDir\mySubdir\default.aspx換成..\default.aspx即可。
問(wèn):如何將SortedList存儲(chǔ)到Session或者Cache里?
答:請(qǐng)參考下面的方法:
SortedList x = new SortedList();
x.Add("Key1", "ValueA");
x.Add("Key2", "ValueB");
保存到Session中:
Session["SortedList1"] = x;
使用下面方法獲得之:
SortedList y = (SortedList) Session["SortedList1"];
Chahe則同理。
問(wèn):我為什么會(huì)獲得這樣的錯(cuò)誤信息“Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive”?
答:這個(gè)問(wèn)題可能在一個(gè)已經(jīng)安裝了Microsoft Visual Studio .NET開(kāi)發(fā)環(huán)境的機(jī)器上,再安裝Window Sharepoint Server(WSS)后出現(xiàn)。
WSS ISAPI過(guò)濾器會(huì)處理所有的請(qǐng)求。當(dāng)你通過(guò)虛擬目錄瀏覽一個(gè)ASP.NET的應(yīng)用程序時(shí),ISAPI過(guò)濾器不會(huì)給文件夾目錄分配URL。
解決方法是:不要再安裝了WSS的機(jī)器上使用Session。
詳細(xì)信息請(qǐng)參考:
Session state cannot be used in ASP.NET with Windows SharePoint Services
http://support.microsoft.com/default.aspx?scid=kb;en-us;837376
問(wèn):如何刪除Session變量?
答:想要?jiǎng)h除Session變量可以使用HttpSessionState.Remove()方法。
問(wèn):是否有辦法知道應(yīng)用程序的Session在運(yùn)行時(shí)占用了多少內(nèi)存?
答:沒(méi)有。目前這個(gè)值時(shí)無(wú)法考證的,至少我現(xiàn)在還沒(méi)有看到這方面的資料。但是可以通過(guò)性能監(jiān)視器以及程序代碼大概估算出來(lái)一個(gè)值。
問(wèn):當(dāng)頁(yè)面中是否了frameset,發(fā)現(xiàn)在每個(gè)frame中顯示頁(yè)面的SessionID在第一次請(qǐng)求時(shí)都不相同,為什么?
答:原因是你的frameset是放在一個(gè)htm頁(yè)面上而不是ASPX頁(yè)面。
在一般情況下,如果frameset是aspx頁(yè)面,當(dāng)你請(qǐng)求頁(yè)面時(shí),它首先將請(qǐng)求發(fā)送到Web服務(wù)器,此時(shí)已經(jīng)獲得了SessionID,接著瀏覽器會(huì)分別請(qǐng)求Frame中的其他頁(yè)面,這樣所有頁(yè)面的SessionID就是一樣的,就是FrameSet頁(yè)面的SessionID。
然而如果你使用Html頁(yè)面做FrameSet頁(yè)面,第一個(gè)請(qǐng)求將是HTML頁(yè)面,當(dāng)該頁(yè)面從服務(wù)器上返回是并沒(méi)有任何Session產(chǎn)生,接著瀏覽器會(huì)請(qǐng)求Frame里面的頁(yè)面,這樣這些頁(yè)面都會(huì)產(chǎn)生自己的SessionID,所以在這種情況下就會(huì)出現(xiàn)這種問(wèn)題。當(dāng)你重新刷新頁(yè)面時(shí),SessionID就會(huì)一樣,并且是最后一個(gè)請(qǐng)求頁(yè)面的SessionID。
問(wèn):是否可以將不同應(yīng)用程序的Session保存在相同的SQL Server服務(wù)器的不同數(shù)據(jù)庫(kù)上。
答:可以,請(qǐng)參考:
FIX: Using one SQL database for all applications for SQL Server session state may cause a bottleneck
http://support.microsoft.com/default.aspx?scid=kb;en-us;836680
問(wèn):在Session_End是我是否可以獲得有效的HttpSessionState和HttpContext對(duì)象?
答:你可以在這個(gè)方法中獲得HttpSessionState對(duì)象,可以直接使用Session來(lái)訪問(wèn)即可。但是不能獲得HttpContext對(duì)象,因?yàn)樵撌录](méi)有和任何請(qǐng)求相關(guān)聯(lián),因此不存在上下文對(duì)象。
問(wèn):在SQLServer模式下使用Session,為什么我的Session不過(guò)期?
答:在SqlServer模式下,Session的過(guò)期是通過(guò)SQL Agent的注冊(cè)工作完成的,請(qǐng)檢查你的SQL Agent是否運(yùn)行?
問(wèn):當(dāng)我設(shè)置EnableSessionState為“ReadOnly”后,但是我在InProc模式下依然可以修改Session的值,這是為什么?
答:即使EnableSessionState標(biāo)示為ReadOnly,但是在InProc模式下用戶依然可以編輯Session。唯一不同的是,在請(qǐng)求過(guò)程中Session將不會(huì)被鎖住。
問(wèn):我如何才能避免在鏈接SQL時(shí)指定密碼?
答:使用信任鏈接或者使用加密的鏈接串。有關(guān)這方面的詳細(xì)信息請(qǐng)參考:
How To Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings
http://support.microsoft.com/default.aspx?scid=kb;en-us;329290
問(wèn):我在我自己的類中該如何使用Session呢?
答:可以使用HttpContext.Current.Session方式使用,具體方法如下:
HttpContext.Current.Session["SessionKey"] = "SessionValue";
類似的你還可以使用這種方式使用Application對(duì)象。
問(wèn):為什么在切換成SQLServer模式后我的請(qǐng)求被掛起了?
答:檢查在Session里面是否都保存的是可以保存在SQLServer模式下的對(duì)象,即這些對(duì)象必須支持序列化。
問(wèn):當(dāng)Session設(shè)置成cookieless后會(huì)有什么影響?
答:當(dāng)把cookieless設(shè)置成true時(shí),主要會(huì)有下面的約束:
1、在頁(yè)面中不能使用絕對(duì)鏈接
2、在應(yīng)用程序中在除了Http和Https之間的切換時(shí)需要完成一些其他的步驟。
如果發(fā)送一個(gè)鏈接給其他人,此時(shí)的URL里面將包含Session ID的信息,所以兩個(gè)人將公用一個(gè)Session。
問(wèn):是否可以將Session保存在數(shù)據(jù)庫(kù)中?
答:當(dāng)然可以,詳細(xì)信息請(qǐng)參考:http://support.microsoft.com/default.aspx?scid=kb;en-us;311209
相關(guān)文章
xls表格導(dǎo)入數(shù)據(jù)庫(kù)功能實(shí)例代碼
這篇文章介紹了xls表格導(dǎo)入數(shù)據(jù)庫(kù)功能實(shí)例代碼,有需要的朋友可以參考一下2013-10-10TreeView無(wú)刷新獲取text及value實(shí)現(xiàn)代碼
這篇文章介紹了TreeView無(wú)刷新獲取text及value實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2013-10-10實(shí)例講解.NET中資源文件的創(chuàng)建與使用
資源文件顧名思義就是存放資源的文件。資源文件在程序設(shè)計(jì)中有著自身獨(dú)特的優(yōu)勢(shì),他獨(dú)立于源程序,這樣資源文件就可以被多個(gè)程序使用2011-12-12IdentityServer4 QuckStart 授權(quán)與自定義Claims的問(wèn)題
這篇文章主要介紹了IdentityServer4 QuckStart 授權(quán)與自定義Claims的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04asp.net下將頁(yè)面內(nèi)容導(dǎo)入到word模板中的方法
asp.net下將頁(yè)面內(nèi)容導(dǎo)入到word模板中的方法,需要的朋友可以參考下。2010-10-10asp.net Grid 導(dǎo)出Excel實(shí)現(xiàn)程序代碼
看了FineUI中的將Grid導(dǎo)出為Excel的實(shí)現(xiàn)方法,實(shí)際上是可以非常簡(jiǎn)單??磥?lái)很難的問(wèn)題,變換一種思路就可以非常簡(jiǎn)單2012-12-12asp.net正則表達(dá)式刪除指定的HTML標(biāo)簽的代碼
抓取某網(wǎng)頁(yè)的數(shù)據(jù)后(比如描述),如果照原樣顯示的話,可能會(huì)因?yàn)樗锩姘瑳](méi)有閉合的HTML標(biāo)簽而打亂了格式,也可能它里面用了比較讓人 費(fèi)解 的HTML標(biāo)簽,把預(yù)訂的格式攪亂.2010-09-09