Q:為什麼Session在有些機器上偶爾會遺失?
答:可能和機器的環境有關係,例如:防火牆或防毒軟體等,嘗試關閉防火牆。
Q:為什麼當呼叫Session.Abandon時並沒有激發Session_End方法?
答:首先Session_End方法只支援InProc(進程內的)類型的Session。其次要激發Session_End方法,必須存在Session(即係統中已經使用Session了),並且至少要完成一次請求(在這次請求中會呼叫該方法)。
Q:為什麼當我在InProc模式下使用Session會經常遺失?
答:該問題通常是由於應用程式被回收導致的,因為當使用進程內Session時,Session是保存在aspnet_wp進程中,當該進程被回收Session自然也就沒有了,確定該進程是否被回收可以通過查看系統的事件檢視器以取得資訊。
具體資訊請參考:
Session variables are lost intermittently in ASP.NET applications
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
在1.0的時候也有一個bug會導致工作流程被回收並重啟,該bug已經在1.1和sp2中修復。
關於該bug的詳細資訊請參考:
ASP.NET Worker Process (Aspnet_wp.exe) Is Recycled Unexpectedly.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792
問:為什麼當Session逾時或Abandoned後,新Session的ID和原來的相同?
答:因為SessionID是保存在客戶端瀏覽器的實例裡,當Session逾時在伺服器重新建立Session時,將使用瀏覽器傳來的SessionID,所以當Session逾時後,再重新建立後SessionID並不變。
Q:為什麼每次請求的SessionID都不相同?
答:該問題可能是沒有在Session裡面保存任何資訊所引起的,即程式中任何地方都沒有使用Session。當Session中保存資訊之後SessionID將一直和瀏覽器相關,此時的SessionID將不會在變更。
Q:ASP和ASP.NET之間是否可以共用Session?
答:可以。但這是一個比較複雜的過程,微軟提供了官方的解決方案,請參考: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET .asp
問:什麼類型的物件可以保存在Session裡?
答:這依賴使用的Session的模式,當使用的是進程內(InProc)的Session那麼可以輕鬆的保存任何物件。如果你使用了非InProc的模式,則只能保存可以序列化和反序列化的對象,如果此時保存的對像不支援序列化,則不能保存到這種模式(非InProc)的Session裡。
Q:為什麼在Session_End中不能使用Response.Redirect和Server.Transfer方法跳轉頁面?
答:Session_End是伺服器內部激發的事件處理函數。它是基於一個伺服器內部的計時器的,在激發該事件時伺服器上並沒有相關的HttpRequest對象,因此此時並不能使用Response.Redirect和Server.Transfer方法。
Q:在Session_End中是否可以獲得HttpContext物件?
答:不行,因為這個事件並沒有和任何的請求(Request)相關聯,沒有基於請求的上下文。
Q:在Web Service中該如何使用Session?
答:為了在Web Service中使用Session,需要在Web Service的呼叫方做一些額外的工作,必須儲存並儲存呼叫Web Service時使用的Cookie。詳細資訊請參考MSDN文件的HttpWebClientProtocol.CookieContainer屬性。然而,如果你使用代理伺服器存取Web Service由於框架的限制,兩者不能共用Session。
Q:在自訂自己的HttpHandler的時候,為什麼不能使用Session?
答:在實現自己的HttpHandler的時候,如果希望使用Session必須實現下面的兩個標記接口中的一個:IRequiresSessionState和IReadOnlySessionState,這些接口沒有任何方法需要實現,只是一個標記接口和使用INamingContainer接口的方法一樣。
Q:當我使用webfarm時,當我重定向到其他的Web伺服器時Session為什麼會遺失?
答:詳細資訊請參考:
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
問:為什麼我的Session在Application_OnAcquireRequestState方法中無效?
答:Session只有在HttpApplication.AcquireRequestState事件呼叫以後才會有效。
詳細資訊請參考:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhandlingpublicevents.asp
問:如果使用了cookieless,我該如何從HTTP頁面導向HTTPS?
答:請嘗試下面的方法:
String originalUrl = "/fxtest3/sub/foo2.aspx";
String modifiedUrl = " https://localhost " + Response.ApplyAppPathModifier(originalUrl);
Response.Redirect(modifiedUrl);
問:Session在global.asax中的那些事件中有效?
答:Session只有在AcquireRequestState事件之後有效,該事件之後的事件都可以使用Session。
Q:如何取得目前Session中儲存的所有物件?
答:可以透過遍歷所有的Session.Keys來獲得。程式碼如下:
ArrayList sessionCollection = new ArrayList();
foreach (string strKey in Session.Keys){
sessionCollection.Add(Session[strKey]);
}
Q:是否可以在不同的應用程式中共享Session?
答:不能直接共享。可以參考如何在ASP和ASP.NET之間共用Session。
Q:Session.Abandon和Session.Clear有何不同?
答:主要的差異在於使用Session.Abandon時,會呼叫Session_End方法(InProc模式下)。當下一個請求到來時將激發Session_Start方法。而Session.Clear只是清除Session中的所有資料並不會中止該Session,因此也不會呼叫那些方法。
Q:為了可以順序存取Session的狀態值,Session是否提供了鎖定機制?
答:Session實作了Reader/Writer的鎖機制:
當頁面對Session具有可寫入功能(即頁面有<%@ Page EnableSessionState="True" %>標記),此時直到請求完成該頁面的Session持有一個寫入鎖定。
當頁面對Session具有唯讀功能(即頁面有<%@ Page EnableSessionState="ReadOnly" %>標記),此時知道請求完成該頁面的Session持有一個讀取鎖定。
讀鎖定將阻塞一個寫鎖定;讀鎖定不會阻塞讀鎖定;寫鎖定將阻塞所有的讀寫鎖定。這就是為什麼兩個框架中的同一個頁面都去寫同一個Session時,其中一個要等待另一個(稍快的那個)完成後,才開始寫。
Q:Session平滑超時意味著什麼?
答:Session平滑超時意味著只要你的頁面訪問(使用)了Session,超時時間將被刷新(可以理解為重新計時),即從該頁面請求開始,將重新計算超時時間。但是,該頁面不能停用Session。它會自動的存取目前頁面的Session,刷新逾時時間。
Q:在global.asax中的事件處理函數中Session為什麼無效?
答:依賴在哪個事件處理函數中使用Session,Session在AcquireRequestState事件之後才有效,該事件之後的所有事件處理函數都可以使用Session,之前的則不能。
Q:當我寫一個依賴目前應用的Session的元件時,為什麼不能直接使用Session["Key"]來獲得其值?
答:Session["Key"]其實是this.Session["Key"],它是作為Page的一個屬性提供的,所以在你的元件中不能直接使用這個屬性。你可以透過下面的方式使用Session:
HttpContext.Current.Session["Key"] = "My Seesion Value";
問:當我使用InProc模式保存Session時,此時的Session是保存在哪裡?
答:不同的IIS的處理方式不同,
當使用的是IIS5的時候Session是儲存在aspnet_wp.exe的進程空間裡的。
當使用的是IIS6時,預設所有的應用程式共用應用程式集區,Session會保存在w3wp.exe的進程空間中。
Q:Session的超時設定是分鐘還是秒?
答:是分鐘,預設為20分鐘。
Q:當頁面出現錯誤後我的Session是否將被儲存?我需要在Session_End中處理一些清理工作,但是失敗了,為什麼?
答:Session_End只有在Session運行在InProc模式下才會被執行。 Session_End使用的帳號是執行aspnet_wp工作流程的帳號(這個可以在machine.config中設定)。因此,如果在Session_End方法裡,使用整合安全性鏈接到SQL,它將使用aspnet_wp進程的帳號打開鏈接,此時成功與否則依賴於你的SQL的安全性設定。
Q:為什麼當我設定cookieless為true是我在重定向的時候會失去Session?
答:使用cookieless時,你必須使用相對路徑替換程式中的絕對路徑,如果使用絕對路徑ASP.NET將無法在URL中儲存SessionID。
例如:將myDirmySubdirdefault.aspx換成..default.aspx即可。
Q:如何將SortedList儲存到Session或Cache?
答:請參考下面的方法:
SortedList x = new SortedList();
x.Add("Key1", "ValueA");
x.Add("Key2", "ValueB");
儲存到Session中:
Session["SortedList1"] = x;
使用下面方法獲得之:
SortedList y = (SortedList) Session["SortedList1"];
Chahe則同理。
Q:我為什麼會得到這樣的錯誤訊息「Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive」?
答:這個問題可能在一個已經安裝了Microsoft Visual Studio .NET開發環境的機器上,再安裝Window Sharepoint Server(WSS)後出現。
WSS ISAPI過濾器會處理所有的請求。當你透過虛擬目錄瀏覽一個ASP.NET的應用程式時,ISAPI過濾器不會為資料夾目錄指派URL。
解決方法是:不要再安裝了WSS的機器上使用Session。
詳細資訊請參考:
Session state cannot be used in ASP.NET with Windows SharePoint Services
http://support.microsoft.com/default.aspx?scid=kb;en-us;837376
問:如何刪除Session變數?
答:想要刪除Session變數可以使用HttpSessionState.Remove()方法。
Q:是否有辦法知道應用程式的Session在運行時佔用了多少記憶體?
答:沒有。目前這個值時無法考證的,至少我現在還沒看到這方面的資料。但是可以透過效能監視器以及程式碼大概估算出來一個值。
Q:當頁面中是否了frameset,發現在每個frame中顯示頁面的SessionID在第一次請求時都不相同,為什麼?
答:原因是你的frameset是放在一個htm頁面上而不是ASPX頁面。
在一般情況下,如果frameset是aspx頁面,當你要求頁面時,它首先將請求發送到Web伺服器,此時已經獲得了SessionID,接著瀏覽器會分別請求Frame中的其他頁面,這樣所有頁面的SessionID就是一樣的,就是FrameSet頁面的SessionID。
然而如果你使用Html頁面做FrameSet頁面,第一個請求將是HTML頁面,當該頁面從伺服器上返回是並沒有任何Session產生,接著瀏覽器會請求Frame裡面的頁面,這樣這些頁面都會產生自己的SessionID,所以在這種情況下就會出現這種問題。當你重新刷新頁面時,SessionID就會一樣,而且是最後一個請求頁面的SessionID。
Q:是否可以將不同應用程式的Session保存在相同的SQL Server伺服器的不同資料庫上。
答:可以,請參考:
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
問:在Session_End是我是否可以獲得有效的HttpSessionState和HttpContext物件?
答:你可以在這個方法中取得HttpSessionState對象,可以直接使用Session來存取即可。但是不能取得HttpContext對象,因為該事件並沒有和任何請求相關聯,因此不存在上下文對象。
Q:在SQLServer模式下使用Session,為什麼我的Session不過期?
答:在SqlServer模式下,Session的過期是透過SQL Agent的註冊工作完成的,請檢查你的SQL Agent是否有運作?
Q:當我設定EnableSessionState為「ReadOnly」後,但是我在InProc模式下依然可以修改Session的值,這是為什麼?
答:即使EnableSessionState標示為ReadOnly,但在InProc模式下使用者仍可編輯Session。唯一不同的是,在請求過程中Session將不會被鎖住。
Q:我如何避免在連結SQL時指定密碼?
答:使用信任連結或使用加密的連結串。有關這方面的詳細資訊請參考:
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
問:我該如何在自己的類別中使用Session呢?
答:可以使用HttpContext.Current.Session方式使用,具體方法如下:
HttpContext.Current.Session["SessionKey"] = "SessionValue";
類似的你還可以用這種方式使用Application物件。
Q:為什麼切換成SQLServer模式後我的請求被掛起了?
答:檢查Session裡面是否都保存的是可以儲存在SQLServer模式下的對象,也就是這些物件必須支援序列化。
Q:當Session設定成cookieless後會有什麼影響?
答:當把cookieless設定成true時,主要會有下面的約束:
1、在頁面中不能使用絕對鏈接
2.在應用程式中在除了Http和Https之間的切換時需要完成一些其他的步驟。
如果傳送一個連結給其他人,此時的URL裡面將包含Session ID的訊息,所以兩個人將公用一個Session。
Q:是否可以將Session保存在資料庫中?
答:當然可以,詳細資訊請參考: http://support.microsoft.com/default.aspx?scid=kb;en-us;311209
----------------- -------------------------------------------------- -------------------------------------------------- -
Q:為什麼當我在InProc模式下使用Session會經常遺失?
補充一種情況:如果使用Access資料庫,為了防止資料庫下載,有人可能會想到會把資料庫檔案放到bin目錄下,這樣資料庫就不能被下載了,但如果在InProc模式下,這樣也會導致Session丟失。因為當訪問應用程式的時候,肯定會經常向資料庫中寫數據,這樣就導致了放在bin目錄下面資料庫檔案的變化,而bin目錄被修改會導致session丟失。
若要解決此問題,可以更換資料庫檔案的存放路徑,或使用StateServer或SqlServer模式。
更多情況請參考:
PRB: Session Data Is Lost When You Use ASP.NET InProc Session State Mode
http://support.microsoft.com/default.aspx?scid=kb;en-us;324772
-------------------------------------------------- -----------------------
Asp.net中多項目共享Session 選擇自dnyz 的Blog
http://dev.csdn.net/article/21/21714.shtm
1. 建立一個空白解決方案blank solution,如:d:MyProjectMyProject.sln
2. 在d:MyProject下方建置一個Web Application的根目錄d:MyProjectWebMis並設為http://localhost/WebMis的虛擬目錄
3. 在WebMis目錄下依模組分別新建目錄,如:d:MyProjectWebMisLogin和d:MyProjectWebMisCheckOut
4. 在VS.net中依據模組新建web application,如: http://localhost/WebMis/Login和http://localhost/WebMis/CheckOut
5. 新建後Login和CheckOut兩個目錄自動被設定為虛擬目錄
6. 在WebMis專案中新增Login和CheckOut的專案引用
7.在IIS管理器中刪除Login和CheckOut的虛擬目錄
8. 刪除各項目的global.asax(除根項目)
9. 除去一個項目的web.config(除根項目)中的如下程式碼:
<authentication mode="Windows" />
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
或刪掉web.config(若不需要在各目錄中進行設定)
10. 編譯後,即可執行。