Session服務器配置指南與使用經(jīng)驗 |
發(fā)布時間: 2012/5/24 20:38:47 |
一.摘要 所有Web程序都會使用Session保存數(shù)據(jù). 使用獨立的Session億恩科技服務器可以解決負載均衡場景中的Session共享問題.本文介紹.NET平臺下建立Session億恩科技服務器的幾種辦法, 并介紹在使用Session時的各種經(jīng)驗和技巧. 二.關于Session,SessionID和Cookies Session數(shù)據(jù)保存在億恩科技服務器端, 但是每一個客戶端都需要保存一個SessionID, SessionID保存在Cookies中, 關閉瀏覽器時過期. 在向億恩科技服務器發(fā)送的HTTP請求中會包含SessionID, 億恩科技服務器端根據(jù)SessionID獲取獲取此用戶的Session信息. 很多初級開發(fā)人員不知道SessionID和Cookies的關系, 所以常常認為兩者沒有聯(lián)系. 這是不正確的. 正是因為SessionID保存在Cookies中, 所以在我們保存Cookies的時候,一定要注意不要因為Cookies的大小和個數(shù)問題而導致SessionID對象. 在我們的程序中, 對SessionID的Cookies有特殊的處理:
//省略掉中間的代碼部分.只保留備份SessionID和找回SessionID的邏輯
將Session保存在獨立的億恩科技服務器中可以實現(xiàn)在多臺Web億恩科技服務器之間共享Session.雖然我們也可以自己開發(fā)Session存儲系統(tǒng), 但是使用ASP.NET自帶的存儲機制將更加便捷. .NET提供了5種保存Seission的方式:
我們可以在Web.Config中配置程序使用的Session存儲方式.默認情況下是InProc, 即保存在IIS進程中. 關于Off, InProc和Customer本文不做講解. 相關文章大家都可以在網(wǎng)上搜索到. 下面主要講解 StateServer 和 SQLServer 的應用. 四.使用 StateServer 模式搭建Session億恩科技服務器 (1)億恩科技服務器端配置 1.啟動 Asp.net State service服務.(這個服務默認的狀態(tài)為手動.修改為自動并啟動.) 2.修改注冊表: [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\aspnet_state\Parameters] 設置 AllowRemoteConnection = 1 , 設置 Port = 42424 (十進制,默認即為42424) Port是服務的端口號 AllowRemoteConnection 表示是否允許其他機器連接,0為僅能本機使用,1為可以供其他機器使用. (2)客戶端設置 在Web應用程序的Web.Config中, 我們需要修改 / 的節(jié)點.如果沒有 沒有則添加(默認使用的是InProc方式) mode="StateServer" stateConnectionString="tcpip=億恩科技服務器ip:42424" cookieless="false" timeout="60"/> 上面的參數(shù)我們可以根據(jù)需要修改. 五.使用SqlServer模式搭建Session億恩科技服務器 (1)億恩科技服務器端配置 使用SqlServer模式搭建Session億恩科技服務器端有兩種方式. ASP.NET 1.0和1.1版本請使用方式a, 2.0即以上版本請使用方式b. a.使用SQL文件創(chuàng)建Session數(shù)據(jù)庫 在ASP.NET 1.0和1.1 版本中, 只能使用這種方式.對于2.0及其以上版本,請使用aspnet_regsql.exe工具.(當然此方法也通用2.0版本) .net提供了數(shù)據(jù)庫安裝腳本,可以在機器的windows文件夾中找到: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ InstallSqlState.sql C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ InstallSqlStateTemplate.sql 根據(jù)ASP.NET的版本不同, 需要使用不同的SQL腳本. ASP.NET主要有1.1和2.0兩個版本,可以在不同的版本文件夾找到這兩個SQL. InstallSqlState.sql 是創(chuàng)建默認名稱的數(shù)據(jù)庫"[ASPState]".此SQL可以直接運行. InstallSqlStateTemplate.sql 可以使用自己指定的數(shù)據(jù)庫保存數(shù)據(jù).此SQL需要自己修改后運行, 打開SQL文件將其中 [DatabaseNamePlaceHolder] 替換為自己指定的數(shù)據(jù)庫名稱. 執(zhí)行installsqlstate.sql時不需要指定數(shù)據(jù)庫,可以在任意數(shù)據(jù)庫上執(zhí)行.此SQL會自己創(chuàng)建新的數(shù)據(jù)庫 b. 使用aspnet_regsql.exe工具 ASP.NET 2.0版本后微軟提供了aspnet_regsql.exe工具可以方便的配置Session數(shù)據(jù)庫.該工具位于 Web 億恩科技服務器上的"系統(tǒng)根目錄\Microsoft.NET\Framework\版本號"文件夾中. 使用舉例: aspnet_regsql.exe -S . -U sa -P 123456 -ssadd -sstype p -S參數(shù): 表示數(shù)據(jù)庫實例名稱. 可以用"."表示本機. -U和-P參數(shù): 表示用戶名和密碼. -E參數(shù): 可以再-U –P 與 -E中選擇一組. –E表示以當前系統(tǒng)用戶通過windows身份驗證登錄數(shù)據(jù)庫, -U -P則是使用SqlServer用戶登錄數(shù)據(jù)庫. -ssadd / –ssremove 參數(shù): -ssadd表示是添加Session數(shù)據(jù)庫, -ssremove表示移除Session數(shù)據(jù)庫. sstype 參數(shù):
(2)Session客戶端設置 此房是同樣需要Web應用程序修改Web.Config中的節(jié)點.如果使用默認的數(shù)據(jù)庫(ASPState庫), 則配置如下: <sessionState 如果使用了自定義的數(shù)據(jù)庫名稱,則還需要制定allowCustomSqlDatabase屬性并在數(shù)據(jù)庫連接串中指定數(shù)據(jù)庫: <sessionState 六.使用經(jīng)驗與技巧總結(jié) 下面是SessionID, Session_End時間, StatServer模式 和 SqlServer模式的各種經(jīng)驗和技巧總結(jié). (1)StateServer模式: 1.在web farm中,請確認在所有的web億恩科技服務器上有相同的 2. 要保存在Session中的對象是可序列化的。 3.為了在web farm中的不同web億恩科技服務器上維護session state,IIS Metabase中的網(wǎng)站:(1tcdy.com)應用程序路徑(如\LM\W3SVC\2)應該在所有的億恩科技服務器上保持一致(大小寫敏感). 4. ASP.NET處理Session是在Machine.Config中配置的HttpModuel模塊, 在.NET的安裝目錄下的Config文件夾中, 查看Web.Config(1.1版本是在Machine.Config): <httpModules> <add name="Session" type="System.Web.SessionState.SessionStateModule"/> ... </httpModules> 確認此模塊是否存在. 5.StateServer不支持負載均衡, 所以如果大并發(fā)推薦使用SqlServer模式, 可以享受到SqlServer的高性能和安全性.雖然存儲效率會有下降. 6.需要讓所有機器的MachineKey相同.在Machine.Config中配置: <machineKey (2)SqlServer模式: 1. 要保存在Session中的對象是可序列化的。 2. 如果使用了默認是數(shù)據(jù)庫, 則在客戶端配置文件中的數(shù)據(jù)庫鏈接字符串的用戶,需要擁有ASPState和tempdb兩個庫的dbowner權限. 3. 在SQLServer模式下,session過期是由SQL Agent使用一個注冊任務完成的,要確認SQL Agent已經(jīng)運行。否則無法清理過期的Session數(shù)據(jù), 會導致數(shù)據(jù)庫數(shù)據(jù)一直增加. 4. 如果使用SqlServer模式時, 對于Web場中的各億恩科技服務器的 ASP.NET 應用程序路徑必須是相同的。請在 IIS 配置數(shù)據(jù)庫中對 Web 場中的所有 Web 億恩科技服務器進行 Web 站點的應用程序路徑同步。大小寫一定要相同,因為 Web 站點的應用程序路徑是區(qū)分大小寫的。 5.需要讓所有機器的MachineKey相同.在Machine.Config中配置: <machineKey (3)Session: 1. 不能直接通過Session億恩科技服務器在ASP.NET和ASP之間共享Session. 請使用微軟提供的解決方案: http://msdn.microsoft.com/zh-cn/library/aa479313.aspx 2. 在不同的應用程序或一個網(wǎng)站:(1tcdy.com)的不同虛擬目錄之間無法共享Session 3. Session的過期時間是滑動時間. 4. Session存儲.NET自帶的值類型性能最優(yōu). 存儲對象會降低性能. (4)SessionID: 1.SessionID 還可以保存在URL上, 設置Web.Config文件中的System.Web/sessionState節(jié)點的Cookiesless屬性即可: <sessionState 2. 一般在Session超時或刪除之后,SessionID保持不變. 因為Session過期后會在億恩科技服務器端清除數(shù)據(jù), 但是SessionID保存在用戶瀏覽器上, 所以只要瀏覽器不關閉則HTTP頭中的SessionID保持不變. 3.關閉瀏覽器后再訪問, SessionID會不同. 4.每打開一個IE6窗口, SessionID都不同, 在IE6中兩個窗口的Session不能共享. 5.FireFox的標簽頁和新的FireFox窗口, SessionID都相同, 在FF的窗口和標簽頁上Session能共享. 6.對于包含F(xiàn)rameSet的頁面,比如: <frameset cols="25%,50%,25%"> 如果后綴名是.htm并且.htm文件沒有交給ASP.NET的ISAPI處理, 那么根據(jù)億恩科技服務器速度在每個Frame頁面生成不同的SessionID, 再刷新后相同都等于最后一個SessionID. 解決辦法是將.htm后綴改成.aspx, 或者將.htm文件交給ASP.NET的ISAPI處理. (5)Session_End事件: 1. Session_End僅在InProc模式中可用 2. 關閉瀏覽器,Session_End是不會觸發(fā)的。HTTP是一種無狀態(tài)協(xié)議,億恩科技服務器沒有辦法知道你的瀏覽器是否已經(jīng)關閉。 3. 當Session因為時間過期或調(diào)用Session.Abandon時,Session_End才會觸發(fā).Session.Clear()僅僅是清除數(shù)據(jù),但沒有刪除session。 4. Session_End由一個后臺線程觸發(fā),使用工作者進程賬號運行. 所以程序不會通知發(fā)生的錯誤. 5. 在Session_End訪問數(shù)據(jù)庫要考慮權限問題. Session_End是用運行工作者進程(aspnet_wp.exe)的帳號運行的,這個賬號可以在machine.config中指定。因此,在Session_End中,如果使用integrity security連接SQL,它將使用工作者進程賬號身份連接,這可能會引起登錄失敗. 6.因為Session_End是有獨立線程出發(fā)的, 所以在Session_End中無法使用HttpContext對象(Request,Response,Server等對象都在HttpContext中), 即無法使用 Response.Redirect 和Server.Transfer等方法. 七.總結(jié) 我已經(jīng)使用SqlServer模式對公司的多臺億恩科技服務器實現(xiàn)了Session共享, 億恩科技服務器重啟也不會導致用戶預定過程重新開始(預定過程需要的Session不會丟失). 希望本文對具體的Session億恩科技服務器搭建人員有所幫助. 本文出自:億恩科技【1tcdy.com】 |