作者:Patrick Y. Ng
原文地址:http://forums.asp.net/7504/ShowPost.aspx
譯者:Tony Qu (來自BluePrint翻譯團(tuán)隊)
原文最后一次更新:2004年9月21日
本文被分成兩部分:
1.“理解Session State模式”——幫助你理解三種Session State的不同之處
2. FAQ
1.理解Session State模式
存儲位置
InProc:session在服務(wù)器中以活動對象方式存儲(aspnet_wp.exe)
StateServer: session被序列化并保存在單獨的aspnet_state.exe的內(nèi)存中。StateServer能夠運行在另一臺服務(wù)器上
SQLServer: session被序列化并保存在SQL Server中
性能:
InProc:最快,但是session數(shù)據(jù)越多,web服務(wù)器上消耗的內(nèi)存也越多,它可能影響性能。
StateServer:當(dāng)存儲基本類型(如string,integer等)數(shù)據(jù)時,在同一個測試環(huán)境中它比InProc慢15%。如果你存儲大量對象,序列化和反序列化可能影響到性能
SQLServer:當(dāng)存儲基本類型(如string,integer等)數(shù)據(jù)時,在同一個測試環(huán)境中它比InProc慢25%。它也有與StateServer一樣的序列化性能問題。
關(guān)于Out-of-Proc(OOP,非InProc)模式的性能提示
如果你使用OOP模式(即StateServer或SQLServer),session state中的序列化和反序列化對象將成為你的主要性能消耗之一。對于基本類型,ASP.NET通過一種內(nèi)部優(yōu)化方法來完成序列化和反序列化。(基本類型包括所有的數(shù)字類型(如Int, Byte, Decimal,String, DateTime, TimeSpan, Guid, IntPtr和UIntPtr等))
如果你有一個session變量(如一個ArrayList對象),且它不是一個基本類型,ASP.NET將使用BinaryFormatter來進(jìn)行序列化和反序列化,那可能會相對慢一些。
所以出于性能考慮,最好使用上面列出的基本類型來存儲所有的session state數(shù)據(jù)。例如,如果你需要存儲兩個東西,名字和地址,在session state中你既可以(方法a)使用兩個string session變量來存儲它們,也可以(方法b)創(chuàng)建一個內(nèi)含兩個string的類來保存它們,然后把這個類對象保存在一個session變量中。出于性能考慮,你應(yīng)該選擇方法a。
為了進(jìn)一步理解這個主題,請看FAQ中的一個問題:“序列化和反序列化如何在SqlServer和StateServer模式下工作”
健壯性
InProc:如果工作者進(jìn)程(aspnet_wp.exe)進(jìn)行資源回收或者應(yīng)用程序域(appdomain)重啟動,session state就會丟失。這是因為session state是保存在一個應(yīng)用程序域的內(nèi)存空間中的。對配置文件(如web.config和machine.config)的修改或者\bin目錄的任何改變(例如在你使用VS編譯應(yīng)用程序后產(chǎn)生了一個新的dll)都可能引起重啟動,詳細(xì)請見KB324772。在1.0中,也有一個bug可能引起工作者進(jìn)程重啟動,但這個bug在1.1中已經(jīng)修復(fù),見KB321792。
如果你使用的是IIS6.0,你可以在IIS Manager中找到Application Pools/DefaultAppPool,其中可以看到回收(Recycling)選項卡與性能(Performace)選項卡中是否有引起IIS工作者進(jìn)程(w3svc.exe)停止工作的參數(shù)。
更多有關(guān)應(yīng)用程序資源回收的內(nèi)容,可以看我的另一篇FAQ:
http://www.asp.net/Forums/ShowPost.aspx?tabindex=1&PostID=232621
StateServer:解決了InProc模式的session state丟失問題。允許一個webfarm在中央服務(wù)器中存儲session。只能在State Server上出現(xiàn)失敗。
SQLServer:與StateServer相似。session state的數(shù)據(jù)在SQL Server重啟后仍然保留著,你也可以按照KB311209的步驟使用SQL server failover cluster
警告
InProc:它不能在web garden模式下工作,因為在這個模式下會有多個aspnet_wp.exe在同一臺機(jī)器上運行。建議在使用web garden使切換到State Server或SQL Server。僅在InProc模式下支持Session_End事件。
StateServer
- 在web farm中,請確認(rèn)在所有的web服務(wù)器上有相同的<machineKey>。KB313091描述了如何設(shè)置它。
- 請確保你的對象是可序列化的。詳見KB312112
- 為了在web farm中的不同web服務(wù)器上維護(hù)session state,IIS Metabase中的網(wǎng)站應(yīng)用程序路徑(如\LM\W3SVC\2)應(yīng)該在所有的服務(wù)器上保持一致(大小寫敏感)。詳見KB325056
SQLServer
- 在1.0中有一個bug,如果你在連接字符串中指定integrity security(如"trusted_connection=true"或 "integrated security=sspi"),且你打開了asp.net的身份模擬,它將不會工作。這個問題在KB324479中有描述,不幸的是這份文檔中的描述和原因部分是錯誤的。不過已經(jīng)有一個QFE fix對它作了修復(fù),這個fix將包含在1.0 sp3中。這個問題在1.1中已經(jīng)修復(fù)了。
- 請確認(rèn)你的對象是可序列化的,否則你的請求可能被掛住,詳見KB312112。SQLServer模式的掛起問題已經(jīng)在1.1中修復(fù),KB324479的QFE fix也修復(fù)了這個問題。1.0 sp3也對這個問題作了修復(fù)。
- 為了在web farm中的不同web服務(wù)器上維護(hù)session state,IIS Metabase中的網(wǎng)站應(yīng)用程序路徑(如\LM\W3SVC\2)應(yīng)該在所有的服務(wù)器上保持一致(大小寫敏感)。詳見KB325056
其他資源
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/aspnetsessionstate.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/CachingArchch2.asp
http://www.411asp.net/home/tutorial/specific/web/sessions
2. FAQ問題列表
Q: session state在部分瀏覽器上工作,而在其他一些上不工作。為什么呢?
Q: 在InProc模式中,為什么我有時會丟失所有的session?
Q: session state在一些web服務(wù)器上工作,但是在其他服務(wù)器上不工作。
Q: 為什么session state不可用?
Q: 為什么session_end沒有觸發(fā)?
Q: 使用InProc模式時,為什么我的session變量頻繁丟失?
Q: 在session超時或刪除之后,為什么SessionID保持不變
Q: 為什么SessionID每一次請求都會改變
Q: Session.Abandon()和Session.Clear()有什么區(qū)別
Q: session的Timeout屬性是一個滑動超時值嗎?
Q: 我可以在ASP.NET和ASP之間共享session嗎?
Q: 我可以在web應(yīng)用程序(例如虛擬目錄或者IIS的應(yīng)用程序)間共享session state嗎?
Q: 在session state中可以存儲哪些類型的對象?
Q: 為什么我的請求在切換到SQLServer模式之后掛住了?
Q: 為什么Response.Redirect和Server.Transfer在Session_End中不工作?
Q: 在Session_End中,我可以獲得一個有效的HttpSessionState對象和HttpContext對象嗎?
Q: 在web service中如何使用session?
Q:我正在寫一個HttpHandler,為什么session stae不工作?
Q: 我正在使用web farm,并且每當(dāng)我重定向到其他服務(wù)器時,session state就會丟失?
Q: 如果使用cookieless,我該如何從一個HTTP頁面重定向到一個HTTPS頁面?
Q: session state有沒有一個鎖機(jī)制來安排對session的訪問順序?
Q: 我該如何檢測一個session過期,然后重定向到另一個頁面
Q: 在Session_End中,我嘗試使用SQL做一些清理工作,但是失敗了,請問為什么?
Q: 我使用的是SQLServer模式,為什么我的session不會過期
Q: 我有一個以htm為擴(kuò)展名的frameset頁面,并且我發(fā)覺其中包含的每個幀在第一次請求時都有一個不同的SessionID,這是為什么?
Q: 我將EnableSessionState設(shè)置為ReadOnly,但是在InProc模式下,我仍然可以修改session,為什么?
Q: 我將cookieless設(shè)置為true,在Redirect之后session變量丟失了,為什么?
Q: 將cookieless設(shè)置為true有哪些缺點
Q: 在InProc模式下,我用編程方式改變了session的超時時間,它觸發(fā)了Session_End,為什么?
Q: 在SQLServer模式下,我可以把session state保存在除tempdb之外的數(shù)據(jù)庫中嗎?
Q: 如何防止將未加密的字符串放在我的連接字符串匯總?
Q: 在使用SQLServer模式時,我需要怎樣的SQL權(quán)限?
Q: 我可以自己寫定制的session state模式嗎?
Q: 在SQLServer或StateServer模式下,序列化和反序列化如何工作?
Q: 我該如何讓我的state server更安全?
Q: 我能否可以使用非global.asax中的處理程序來訂閱SessionStateModule.End事件?
Q: 不同的應(yīng)用程序可以把他們的session state保存在同一個SQL Server上的不同數(shù)據(jù)庫中嗎?
Q: session state在部分瀏覽器上工作,而在其他一些上不工作。為什么呢?
A: 估計你沒有使用cookieless,你必須保證你的瀏覽器支持cookie。請參考這份KB:http://support.microsoft.com/default.aspx?scid=kb;EN-US;q316112
Q: 在InProc模式中,為什么我有時會丟失所有的session?
A: 請見理解session state模式的健壯性部分
Q: session state在一些web服務(wù)器上工作,但是在其他服務(wù)器上不工作。
A: 可能是機(jī)器名的問題,見http://support.microsoft.com/default.aspx?scid=kb;EN-US;q316112
Q: 為什么session state不可用?
A:
- 首先,檢查web.config、machine.config和Page標(biāo)簽來確認(rèn)你啟用了session state
參考資料:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconsessionstate.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconpage.asp
- 請注意session state并非在任何地方、任何時間都可以使用,它僅在HttpApplication.AcquireRequestState事件之后可用。例如,在 global.asax中的Application_OnAuthenticateRequest處理程序中,session state不可用
- 請確認(rèn)System.Web.SessionState.SessionStateModule已包含在配置文件的< httpModules>節(jié)中。一個常見的例子是,出于性能考慮,SharePoint應(yīng)用程序會把這個模塊從web.config文件中移除,因此導(dǎo)致session不可用
Q: 為什么session_end沒有觸發(fā)?
A: 這是最常見的問題之一
1. 請記住session_end僅在InProc模式中可用
2. 關(guān)閉瀏覽器,session_end是不會觸發(fā)的。HTTP是一種無狀態(tài)協(xié)議,服務(wù)器沒有辦法知道你的瀏覽器是否已經(jīng)關(guān)閉。
3. 當(dāng)有n分鐘(n=timeout值)的無操作或調(diào)用Session.Abandon時,Session_End才會觸發(fā)
4. 對于情況1而言,Session_End將由一個后臺線程觸發(fā),這表示:
a. Session_End中的代碼使用工作者進(jìn)程賬號運行,如果你訪問如數(shù)據(jù)庫這樣的資源時,可能會有權(quán)限問題。
b. 如果在Session_End中發(fā)生錯誤,程序不會通知發(fā)生了什么
5. 對于情況2而言,為了讓Session_End觸發(fā),session state必須先存在。這意味著你必須在session state中存儲一些數(shù)據(jù),并且已經(jīng)完成了至少一個請求
6. 還是對于情況2而言,Session_End僅在被丟棄的session被找到的時候才會觸發(fā)。這樣的話,如果你在同一個請求中創(chuàng)建并丟棄一個 session,由于session沒有被保存,因此也不會被找到,Session_End將不會被調(diào)用。這是v1.0和v1.1中的bug。
Q: 使用InProc模式時,為什么我的session變量頻繁丟失?
A: 有可能是應(yīng)用程序資源回收引起的,見http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
在v1.0中有一個bug可能會導(dǎo)致工作者進(jìn)程重啟動。在v1.1和v 1.0sp2中已經(jīng)修復(fù)。見http://support.microsoft.com/default.aspx?scid=kb;EN-US;321792
關(guān)于應(yīng)用程序資源回收的詳細(xì)信息,請見我的另一篇:FAQhttp://www.asp.net/Forums/ShowPost.aspx?tabindex=1&PostID=232621
Q: 在session超時或刪除之后,為什么SessionID保持不變
A: 盡管在超時周期之后session state過期,sessionID將一直保持到瀏覽器session過期為止,也就是說,一個相同的sessionID可以有多次session超時,但是始終對應(yīng)著一個相同的瀏覽器實例。
Q: 為什么SessionID每一次請求都會改變
A: 如果你的應(yīng)用程序從未在session state中存儲過數(shù)據(jù)。在這種情況下,那么每次請求都會創(chuàng)建一個新的session state(ID也是新的),但是不會被存儲,因為里面什么數(shù)據(jù)都沒有。
盡管如此,有兩種例外可能產(chǎn)生相同的Session ID
- 如果用戶使用相同的瀏覽器實例來請求另一個使用session state的頁面,那么你每次獲得的Session ID是相同的。詳見“在session超時或刪除之后,為什么SessionID保持不變?”
- 如果使用了Session_OnStart事件,即使session為空,asp.net也會保存session state。
Q: Session.Abandon()和Session.Clear()有什么區(qū)別
A: 主要的區(qū)別在于,如果你調(diào)用Session.Abandon(), Session_End將被觸發(fā)(僅在InProcxi下適用),在下一個請求中,Session_Start觸發(fā)。而Session.Clear()僅僅是清除數(shù)據(jù),但沒有刪除session。
Q: session的Timeout屬性是一個滑動超時值嗎?
A: Session的Timeout是一個滑動過期時間,意思是一旦你的頁面訪問session state,過期時間就會向挪。注意,只要頁面沒有被禁用,在請求時頁面就會自動訪問session
Q: 我可以在ASP.NET和ASP之間共享session嗎?
A:不可以。但是有一篇文章講到了如何來繞過這個問題:http://www.msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET.asp
當(dāng)然也有一些第三方解決方案。
Q: 我可以在web應(yīng)用程序(例如虛擬目錄或者IIS的應(yīng)用程序)間共享session state嗎?
A:不能。
Q: 在session state中可以存儲哪些類型的對象?
A:這是由你使用的模式?jīng)Q定的
- 如果你使用的是InProc模式,存儲在session state中的對象是活對象,那么你就可以存儲你創(chuàng)建的任何對象
- 如果你使用的是SQLServer或State Server模式,當(dāng)處理一個請求時,session state中的對象對象將被序列化和反序列化,所以請確認(rèn)你的對象都是可序列化的,而它們的類都作了可序列化標(biāo)記。如果沒有,session state將不會成功存儲。在v1.0中,有一個bug,當(dāng)這個問題發(fā)生時,如果使用SQLServer模式,請求可能在不知情的情況下被掛起。掛起的問題在v1.1和v1.0 sp3中已經(jīng)修復(fù)。KB324479的QFE fix也包含了對這一問題的修復(fù)。
更多信息請見:http://support.microsoft.com/directory/article.asp?ID=KB;EN-US;q312112
Q: 為什么我的請求在切換到SQLServer模式之后掛住了?
A:請看問題“在session state中可以存儲哪些類型的對象?”的答案
Q: 為什么Response.Redirect和Server.Transfer在Session_End中不工作?
A:Session_End是在服務(wù)器內(nèi)部觸發(fā)的,它基于一個內(nèi)部的計時器。因此,在事件觸發(fā)時,與任何HttpRequest對象無關(guān)。這也是為什么Response.Redirect 和Server.Transfer不工作的原因。
Q: 在Session_End中,我可以獲得一個有效的HttpSessionState對象和HttpContext對象嗎?
A: 你可以獲得httpSessionState對象,你可以使用'Session'來訪問該對象。但是你無法訪問HttpContext,因為這個事件和請求沒有任何關(guān)系。
Q: 在web service中如何使用session?
A: 需要在調(diào)用方使用一些技巧,你必須保存web服務(wù)使用的cookie。請見關(guān)于HttpWebClientProtocol.CookieContainer的MSDN文檔。
盡管如此,如果你是通過代理對象從你的頁面調(diào)用web服務(wù),由于架構(gòu)限制,web服務(wù)和你的頁面無法共享session state。
如果你通過redirect調(diào)用web服務(wù),這是可以完成的
Q:我正在寫一個HttpHandler,為什么session stae不工作?
A: 你的HttpHandler接口必須實現(xiàn)標(biāo)記接口IRequiresSessionState或IReadOnlySessionState,方能使用session state。
Q: 我正在使用web farm,并且每當(dāng)我重定向到其他服務(wù)器時,session state就會丟失?
A: 為了在web farm中的不同服務(wù)器之間維護(hù)session state,IIS Metabase中的網(wǎng)站應(yīng)用程序路徑(例如 \LM\W3SVC\2)應(yīng)該在所有的web服務(wù)器上保持一致(大小寫敏感)。詳見KB325056
Q: 如果使用cookieless,我該如何從一個HTTP頁面重定向到一個HTTPS頁面?
A: 嘗試使用下面的代碼:
String originalUrl = "/fxtest3/sub/foo2.aspx";
String modifiedUrl = "https://localhost" + Response.ApplyAppPathModifier(originalUrl);
Response.Redirect(modifiedUrl);
Q: session state有沒有一個鎖機(jī)制來安排對session的訪問順序?
A:session state實現(xiàn)了讀寫鎖定機(jī)制:
- 對session state有寫權(quán)限(如<%@ Page EnableSessionState="True" %> )的頁面或幀將獲得這個session的寫鎖,直到請求結(jié)束。
- 對session state有讀權(quán)限(如<%@ Page EnableSessionState="ReadOnly" %> )的頁面或幀將獲得這個session的讀鎖,直到請求結(jié)束。
- 讀鎖會阻塞寫鎖;讀鎖不會阻塞讀鎖;寫鎖會阻塞所有的讀鎖和寫鎖
- 這也是為什么當(dāng)兩個幀同時擁有session的訪問權(quán)限時,一個幀必須等待另一幀先完成
Q: 我該如何檢測一個session過期,然后重定向到另一個頁面
A: 這是經(jīng)常要遇到的問題,但不幸的是沒有很簡單的方法來完成它。我們將期待在一個主要版本中實現(xiàn)它。同時,如果你使用cookie,你可以在cookie中存儲一個標(biāo)志,這樣你就可以區(qū)分新瀏覽器+新session及舊瀏覽器+過期session,下面的代碼在session過期時會重定向到一個過期頁面。
void Session_OnStart(Object sender, EventArgs e) {
HttpContext context = HttpContext.Current;
HttpCookieCollection cookies = context.Request.Cookies;
if (cookies["starttime"] == null) {
HttpCookie cookie = new HttpCookie("starttime", DateTime.Now.ToString());
cookie.Path = "/";
context.Response.Cookies.Add(cookie);
}
else {
context.Response.Redirect("expired.aspx");
}
}
Q: 在Session_End中,我嘗試使用SQL做一些清理工作,但是失敗了,請問為什么?
A: 首先,session_End僅在InProc模式下支持。
第二,Session_End是用運行工作者進(jìn)程(aspnet_wp.exe)的帳號運行的,這個賬號可以在machine.config中指定。因此,在你的Session_End中,如果使用integrity security連接SQL,它將使用工作者進(jìn)程賬號身份連接,這可能會引起登錄失敗,這要看你的SQL安全設(shè)置了。
Q: 我使用的是SQLServer模式,為什么我的session不會過期
A: 在SQLServer模式下,session過期是由SQL Agent使用一個注冊任務(wù)完成的,請確認(rèn)你的SQL Agent是否已經(jīng)運行。
Q: 我有一個以htm為擴(kuò)展名的frameset頁面,并且我發(fā)覺其中包含的每個幀在第一次請求時都有一個不同的SessionID,這是為什么?
A: 原因是你的frameset頁面是一個htm文件而不是一個aspx頁面
在通常情況下,如果一個frameset頁為一個aspx文件,當(dāng)你請求該頁面時,會首先發(fā)請求給web服務(wù)器,你會收到一個asp.net session cookie(其中保存著session id),然后瀏覽器會為frame發(fā)送一個單獨的請求,而每個請求將擁有相同的session id。
然而,因為你的頁面是一個htm文件,第一個請求就不會獲得任何session cookie,因為頁面是由asp處理的而非asp.net,然后瀏覽器會為每個幀發(fā)送單獨的請求。但是,這次每個單獨的請求將不會持有任何 session id,這樣的話每個幀將創(chuàng)建自己的session。這也是為什么你在每個幀中看到的session id都不同。最后一個請求將贏得勝利,因為它將覆蓋前兩個請求寫入的cookie。如果你刷新一次,你將看到它們擁有了相同的session id。
這個行為是設(shè)計所決定的,簡單的解決方法就是將frameset頁面改稱aspx
Q: 我將EnableSessionState設(shè)置為ReadOnly,但是在InProc模式下,我仍然可以修改session,為什么?
A: 盡管那些EnableSessionState被設(shè)置為ReadOnly,但是在InProc模式中,用戶仍然可以修改session。唯一的區(qū)別在于session在請求中不會被鎖住,這一限制是設(shè)計所決定的。對于這一點沒有在msdn中提到我表示抱歉。
Q: 我將cookieless設(shè)置為true,在Redirect之后session變量丟失了,為什么?
A: 如果你使用的是cookieless,你必須使用相對路徑(如..\hello.aspx),而不是絕對路徑(如\foo\bar\hello.aspx)。如果你使用的是絕對路徑,ASP.NET不會將session id保存在url中。
Q: 將cookieless設(shè)置為true有哪些缺點
A: 設(shè)置cookieless=true表示一些潛在的規(guī)則,主要有:
1. 你不能在你的頁面中使用絕對路徑
2. 在http和https之間切換的話,你必須做一些額外的動作
3. 如果你的客戶發(fā)送了一個鏈接到一個朋友,URL將包含session id,兩個用戶可以在同一時間使用相同的session id
Q: 在InProc模式下,我用編程方式改變了session的超時時間,它觸發(fā)了Session_End,為什么?
A: 這是InProc的一個bug。如果你更改session的timeout值為另一個值,Session_End將被調(diào)用(但不會調(diào)用Session_Start)。我們期待在v2.0中能夠修復(fù)這個錯誤。
Q: 在SQLServer模式下,我可以把session state保存在除tempdb之外的數(shù)據(jù)庫中嗎?
A: 是的。見KB311209。
Q: 如何防止將未加密的字符串放在我的連接字符串匯總?
A: 見sql trusted connection或者將連接字符串以加密數(shù)據(jù)形式保存在注冊表中。詳情請見,KB329250和KB329290。
Q: 在使用SQLServer模式時,我需要怎樣的SQL權(quán)限?
A: 調(diào)用者需要對下面的存儲過程擁有EXEC權(quán)限,
dbo.TempGetAppID
dbo.TempGetStateItem
dbo.TempGetStateItemExclusive
dbo.TempReleaseStateItemExclusive
dbo.TempInsertStateItemLong
dbo.TempInsertStateItemShort
dbo.TempUpdateStateItemLong
dbo.TempUpdateStateItemShort
dbo.TempUpdateStateItemShortNullLong
dbo.TempUpdateStateItemLongNullShort
dbo.TempRemoveStateItem
dbo.TempResetTimeout
在v1.1中,你也需要對下面的存儲過程擁有EXEC權(quán)限
dbo.TempGetStateItem2
dbo.TempGetStateItemExclusive2
請注意存儲過程的擁有者必須對session state表(dbo.ASPStateTempSessions和 dbo.ASPStateTempApplications)擁有SELECT/INSERT/UPDATE/DELETE 權(quán)限。通常,擁有者是執(zhí)行installsqlstate.sql(或者持久版本,見KB311209)的帳號來安裝sql session state需要的表、存儲過程、數(shù)據(jù)庫
也請注意,如果你的session state表在tempdb中(默認(rèn)情況下)如果你對SQL Server進(jìn)行資源回收,所有在這張表上的權(quán)限設(shè)置將丟失。
Q: 我可以自己寫定制的session state模式嗎?
A:(待翻譯)
Q: 在SQLServer或StateServer模式下,序列化和反序列化如何工作?
A: (待翻譯)
Q: 我該如何讓我的state server更安全?
A:如果state server和web server運行在一臺機(jī)器上,通過設(shè)置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ aspnet_state\Param ters\AllowRemoteConnection的dword項為0,可以讓state server僅在本地運行。這樣就可以防止遠(yuǎn)程客戶端連見到state server上。這一特性在v1.1中可用,在v1.0 sp3中也有。
state server必須受防火墻保護(hù),以防止外部連接以保證真正安全。默認(rèn)的端口是TCP 42424,你可以設(shè)置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ aspnet_state\Param ters\Port來改變它。如果是本地模式,除了127.0.0.1以外,屏蔽所有外來連接;如果是遠(yuǎn)程模式,顯式的禁用所有的地址,除了對wev服務(wù)器的連接。
使用IPSec是另一種保護(hù)state server的方式。
Q: 我能否可以使用非global.asax中的處理程序來訂閱SessionStateModule.End事件?
A: 答案是否定的。當(dāng)SessionStateModule觸發(fā)End事件時,只有定義在global.asax中的方法才會被觸發(fā)
這是出于安全原因考慮的才對此進(jìn)行限制。假設(shè)asp.net允許用戶使用的其他的處理程序來處理End事件。在這種情況下,用戶通常使用一個頁面方法作為處理程序,當(dāng)你在事件訂閱時傳入處理程序,處理程序?qū)⑴c你的程序運行在的HttpApplication實例關(guān)聯(lián)。請注意, HttpApplication實例會被回收來處理其他請求。這樣的話,當(dāng)End事件觸發(fā)時,asp.net將調(diào)用處理程序,而與之關(guān)聯(lián)的 HttpApplication實例已經(jīng)被另一個請求所使用,這樣的情況將引發(fā)各種各樣的問題。為了避免這種危險,在v1.0中決定進(jìn)調(diào)用 Global.asax中定義的方法。希望你們都可以忍受這一限制。
Q: 不同的應(yīng)用程序可以把他們的session state保存在同一個SQL Server上的不同數(shù)據(jù)庫中嗎?
A: 答案是肯定的。詳情請見:http://support.microsoft.com/default.aspx?scid=kb;EN-US;836680