亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

Session服務器配置指南與使用經驗

2024-09-01 13:44:29
字體:
來源:轉載
供稿:網友

一.摘要

所有Web程序都會使用Session保存數據. 使用獨立的Session服務器可以解決負載均衡場景中的Session共享問題.本文介紹.NET平臺下建立Session服務器的幾種辦法, 并介紹在使用Session時的各種經驗和技巧.

二.關于Session,SessionID和Cookies

Session數據保存在服務器端, 但是每一個客戶端都需要保存一個SessionID, SessionID保存在Cookies中, 關閉瀏覽器時過期.

在向服務器發送的HTTP請求中會包含SessionID, 服務器端根據SessionID獲取獲取此用戶的Session信息.

很多初級開發人員不知道SessionID和Cookies的關系, 所以常常認為兩者沒有聯系. 這是不正確的. 正是因為SessionID保存在Cookies中, 所以在我們保存Cookies的時候,一定要注意不要因為Cookies的大小和個數問題而導致SessionID對象. 在我們的程序中, 對SessionID的Cookies有特殊的處理:

        /// <summary>        /// 寫入cookie.        /// </summary>        /// <param name="day"></param>        /// <returns></returns>        public bool SetCookie(int day)        {            string CookieName = GetType().ToString();            HttpCookie SessionCookie = null;            //對 SessionId 進行備份.            if (HttpContext.Current.Request.Cookies["ASP.NET_SessionId"] != null)            {                string SesssionId = HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value.ToString();                SessionCookie = new HttpCookie("ASP.NET_SessionId");                SessionCookie.Value = SesssionId;            }
            //省略掉中間的代碼部分.只保留備份SessionID和找回SessionID的邏輯
                        //如果cookie總數超過20 個, 重寫ASP.NET_SessionId, 以防Session 丟失.            if (HttpContext.Current.Request.Cookies.Count > 20 && SessionCookie != null)            {                if (SessionCookie.Value != string.Empty)                {                            HttpContext.Current.Response.Cookies.Remove("ASP.NET_SessionId");                    HttpContext.Current.Response.Cookies.Add(SessionCookie);                }            }            return true;        }

 

三.搭建Session服務器的幾種方式

將Session保存在獨立的服務器中可以實現在多臺Web服務器之間共享Session.雖然我們也可以自己開發Session存儲系統, 但是使用ASP.NET自帶的存儲機制將更加便捷.

.NET提供了5種保存Seission的方式:

 

方式名稱

存儲方式 性能

Off

設置為不使用Session功能

InProc

設置為將Session存儲在進程內,就是ASP中的存儲方式,這是默認值。

性能最高

StateServer

設置為將Session存儲在獨立的狀態服務中。通常是aspnet_state.exe進程.

性能損失10-15%

SQLServer

設置將Session存儲在SQL Server中。

性能損失10-20%

Customer

自定制的存儲方案

由實現方式確定

 

我們可以在Web.Config中配置程序使用的Session存儲方式.默認情況下是InProc, 即保存在IIS進程中. 關于Off, InProc和Customer本文不做講解. 相關文章大家都可以在網上搜索到.

下面主要講解 StateServer 和 SQLServer 的應用.

四.使用 StateServer 模式搭建Session服務器

(1)服務器端配置

1.啟動 Asp.net State service服務.(這個服務默認的狀態為手動.修改為自動并啟動.)

2.修改注冊表: [HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/aspnet_state/Parameters]

設置 AllowRemoteConnection = 1 , 設置 Port = 42424 (十進制,默認即為42424)

Port是服務的端口號

AllowRemoteConnection 表示是否允許其他機器連接,0為僅能本機使用,1為可以供其他機器使用.

(2)客戶端設置

在Web應用程序的Web.Config中, 我們需要修改 <configuration> / <system.web> 的<sessionState>節點.如果沒有

沒有則添加(默認使用的是InProc方式)

<sessionState mode="StateServer" stateConnectionString="tcpip=服務器ip:42424" cookieless="false" timeout="60"/>

上面的參數我們可以根據需要修改.

 

五.使用SqlServer模式搭建Session服務器

(1)服務器端配置

 

使用SqlServer模式搭建Session服務器端有兩種方式. ASP.NET 1.0和1.1版本請使用方式a, 2.0即以上版本請使用方式b.

a.使用SQL文件創建Session數據庫

 

在ASP.NET 1.0和1.1 版本中, 只能使用這種方式.對于2.0及其以上版本,請使用aspnet_regsql.exe工具.(當然此方法也通用2.0版本)

.net提供了數據庫安裝腳本,可以在機器的windows文件夾中找到:

C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/ InstallSqlState.sql

C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/ InstallSqlStateTemplate.sql

根據ASP.NET的版本不同, 需要使用不同的SQL腳本. ASP.NET主要有1.1和2.0兩個版本,可以在不同的版本文件夾找到這兩個SQL.

InstallSqlState.sql 是創建默認名稱的數據庫"[ASPState]".此SQL可以直接運行.

InstallSqlStateTemplate.sql 可以使用自己指定的數據庫保存數據.此SQL需要自己修改后運行, 打開SQL文件將其中 [DatabaseNamePlaceHolder] 替換為自己指定的數據庫名稱.

執行installsqlstate.sql時不需要指定數據庫,可以在任意數據庫上執行.此SQL會自己創建新的數據庫

b. 使用aspnet_regsql.exe工具

ASP.NET 2.0版本后微軟提供了aspnet_regsql.exe工具可以方便的配置Session數據庫.該工具位于 Web 服務器上的"系統根目錄/Microsoft.NET/Framework/版本號"文件夾中.

 

使用舉例:

aspnet_regsql.exe -S . -U sa -P 123456 -ssadd -sstype p

-S參數:

表示數據庫實例名稱. 可以用"."表示本機.

-U和-P參數:

表示用戶名和密碼.

-E參數:

可以再-U –P 與 -E中選擇一組. –E表示以當前系統用戶通過windows身份驗證登錄數據庫, -U -P則是使用SqlServer用戶登錄數據庫.

-ssadd / –ssremove 參數:

-ssadd表示是添加Session數據庫, -ssremove表示移除Session數據庫.

sstype 參數:

選項

說明

t

將會話數據存儲到 SQL Server tempdb 數據庫中。這是默認設置。如果將會話數據存儲到 tempdb 數據庫中,則在重新啟動 SQL Server 時將丟失會話數據。

p

將會話數據存儲到 ASPState 數據庫中,而不是存儲到 tempdb 數據庫中。

c

將會話數據存儲到自定義數據庫中。如果指定 c 選項,則還必須使用 -d 選項包括自定義數據庫的名稱。

 

(2)Session客戶端設置

此房是同樣需要Web應用程序修改Web.Config中的<sessionState>節點.如果使用默認的數據庫(ASPState庫), 則配置如下:

    <sessionState      mode="SQLServer"      sqlConnectionString="server=192.168.9.151; uid=sa; pwd=123456;"      />

如果使用了自定義的數據庫名稱,則還需要制定allowCustomSqlDatabase屬性并在數據庫連接串中指定數據庫:

    <sessionState      mode="SQLServer"      allowCustomSqlDatabase="true"      sqlConnectionString="server=192.168.9.151; DataBase=MyAspState;uid=sa; pwd=123456;"      />

 

六.使用經驗與技巧總結

下面是SessionID, Session_End時間, StatServer模式 和 SqlServer模式的各種經驗和技巧總結.

(1)StateServer模式:

1.在web farm中,請確認在所有的web服務器上有相同的<machineKey>

2. 要保存在Session中的對象是可序列化的。

3.為了在web farm中的不同web服務器上維護session state,IIS Metabase中的網站應用程序路徑(如/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不支持負載均衡, 所以如果大并發推薦使用SqlServer模式, 可以享受到SqlServer的高性能和安全性.雖然存儲效率會有下降.

6.需要讓所有機器的MachineKey相同.在Machine.Config中配置:

<machineKey validationKey="1234567890123456789012345678901234567890AAAAAAAAAA" decryptionKey="123456789012345678901234567890123456789012345678" validation="SHA1" decryption="Auto" />

(2)SqlServer模式:

1. 要保存在Session中的對象是可序列化的。

2. 如果使用了默認是數據庫, 則在客戶端配置文件中的數據庫鏈接字符串的用戶,需要擁有ASPState和tempdb兩個庫的dbowner權限.

3. 在SQLServer模式下,session過期是由SQL Agent使用一個注冊任務完成的,要確認SQL Agent已經運行。否則無法清理過期的Session數據, 會導致數據庫數據一直增加.

4. 如果使用SqlServer模式時, 對于Web場中的各服務器的 ASP.NET 應用程序路徑必須是相同的。請在 IIS 配置數據庫中對 Web 場中的所有 Web 服務器進行 Web 站點的應用程序路徑同步。大小寫一定要相同,因為 Web 站點的應用程序路徑是區分大小寫的。

5.需要讓所有機器的MachineKey相同.在Machine.Config中配置:

<machineKey validationKey="1234567890123456789012345678901234567890AAAAAAAAAA" decryptionKey="123456789012345678901234567890123456789012345678" validation="SHA1" decryption="Auto" />

(3)Session:

1. 不能直接通過Session服務器在ASP.NET和ASP之間共享Session. 請使用微軟提供的解決方案: 
http://msdn.microsoft.com/zh-cn/library/aa479313.aspx

2. 在不同的應用程序或一個網站的不同虛擬目錄之間無法共享Session

3. Session的過期時間是滑動時間.

4. Session存儲.NET自帶的值類型性能最優. 存儲對象會降低性能.

 

(4)SessionID:

1.SessionID 還可以保存在URL上, 設置Web.Config文件中的System.Web/sessionState節點的Cookiesless屬性即可:

    <sessionState      cookieless="UseUri"      />
 

2. 一般在Session超時或刪除之后,SessionID保持不變. 因為Session過期后會在服務器端清除數據, 但是SessionID保存在用戶瀏覽器上, 所以只要瀏覽器不關閉則HTTP頭中的SessionID保持不變.

3.關閉瀏覽器后再訪問, SessionID會不同.

4.每打開一個IE6窗口, SessionID都不同, 在IE6中兩個窗口的Session不能共享.

5.FireFox的標簽頁和新的FireFox窗口, SessionID都相同, 在FF的窗口和標簽頁上Session能共享.

6.對于包含FrameSet的頁面,比如:

<frameset cols="25%,50%,25%">  <frame src="SessionID.aspx">  <frame src="SessionID.aspx">  <frame src="SessionID.aspx"></frameset>

如果后綴名是.htm并且.htm文件沒有交給ASP.NET的ISAPI處理, 那么根據服務器速度在每個Frame頁面生成不同的SessionID, 再刷新后相同都等于最后一個SessionID.

解決辦法是將.htm后綴改成.aspx, 或者將.htm文件交給ASP.NET的ISAPI處理. 

(5)Session_End事件:

 

 

1. Session_End僅在InProc模式中可用

2. 關閉瀏覽器,Session_End是不會觸發的。HTTP是一種無狀態協議,服務器沒有辦法知道你的瀏覽器是否已經關閉。

3. 當Session因為時間過期或調用Session.Abandon時,Session_End才會觸發.Session.Clear()僅僅是清除數據,但沒有刪除session。

4. Session_End由一個后臺線程觸發,使用工作者進程賬號運行. 所以程序不會通知發生的錯誤.

5. 在Session_End訪問數據庫要考慮權限問題. Session_End是用運行工作者進程(aspnet_wp.exe)的帳號運行的,這個賬號可以在machine.config中指定。因此,在Session_End中,如果使用integrity security連接SQL,它將使用工作者進程賬號身份連接,這可能會引起登錄失敗.

6.因為Session_End是有獨立線程出發的, 所以在Session_End中無法使用HttpContext對象(Request,Response,Server等對象都在HttpContext中),  即無法使用 Response.Redirect 和Server.Transfer等方法.

七.總結

 

我已經使用SqlServer模式對公司的多臺服務器實現了Session共享, 服務器重啟也不會導致用戶預定過程重新開始(預定過程需要的Session不會丟失).  希望本文對具體的Session服務器搭建人員有所幫助. 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲天堂色网站| 国产精品视频午夜| 欧美色视频日本高清在线观看| 97在线视频免费观看| 欧美激情欧美激情在线五月| 亚洲xxxx做受欧美| 久久99久久亚洲国产| 欧美大尺度电影在线观看| 亚洲视频在线观看网站| 成人免费xxxxx在线观看| 日韩欧美极品在线观看| 日韩在线视频网站| 欧美人交a欧美精品| 国产精品久久999| 一区二区三区国产视频| 91青草视频久久| 欧美在线观看www| 欧美成人免费在线观看| 欧美在线视频在线播放完整版免费观看| 91久久久久久久一区二区| 亚洲成人在线视频播放| 成人免费在线视频网站| 97视频免费在线看| 欧美在线观看日本一区| 午夜精品久久久久久99热| 国产欧美日韩中文字幕| 色樱桃影院亚洲精品影院| 亚洲视频一区二区三区| 日韩精品视频中文在线观看| 美女国内精品自产拍在线播放| 午夜精品久久久久久久99热浪潮| 欧美日韩中国免费专区在线看| 亚洲视频在线看| 日韩精品中文在线观看| 欧美日韩在线免费观看| 在线成人一区二区| 欧美极品少妇xxxxⅹ免费视频| 国产在线观看91精品一区| 国产精品1区2区在线观看| 精品无人区太爽高潮在线播放| 国语自产在线不卡| 成人av番号网| 97视频免费在线看| 日韩av最新在线| 成人免费看吃奶视频网站| 欧美第一黄网免费网站| 91精品视频在线| 国产98色在线| 亚洲午夜av久久乱码| 亚洲天堂成人在线视频| 亚洲视频欧洲视频| 欧美在线亚洲在线| 久久99久国产精品黄毛片入口| 美乳少妇欧美精品| 欧美激情三级免费| 日av在线播放中文不卡| 永久免费精品影视网站| 伊人久久久久久久久久久| 色悠久久久久综合先锋影音下载| 国产精品国语对白| 国产欧美一区二区三区久久人妖| 欧美精品电影在线| 欧美另类在线播放| 91久久综合亚洲鲁鲁五月天| 精品国产31久久久久久| 亚洲欧美日韩国产精品| 中文字幕亚洲无线码a| 91精品国产综合久久香蕉922| 中文字幕亚洲欧美| 91国自产精品中文字幕亚洲| 91久久精品国产91久久| 欧美成人h版在线观看| 国产精品普通话| 亚洲精品xxxx| 亚洲欧美一区二区三区在线| 日本老师69xxx| 欧美成人免费一级人片100| 热99在线视频| 亚洲韩国欧洲国产日产av| 色久欧美在线视频观看| 96精品视频在线| y97精品国产97久久久久久| 久久久亚洲国产| 九九热这里只有精品免费看| 亚洲va国产va天堂va久久| 欧美电影免费观看高清完整| 成人国产精品久久久久久亚洲| 日本一区二区三区四区视频| 国产精品久久网| 日韩精品免费在线视频观看| 国产视频亚洲视频| 91精品国产自产在线老师啪| 亚洲新声在线观看| 色www亚洲国产张柏芝| 亚洲综合色av| 在线观看日韩欧美| 国产一区欧美二区三区| 久久久久久久久国产| 亚洲黄色av网站| 欧美激情高清视频| 九九综合九九综合| 日韩欧中文字幕| 91精品国产自产在线观看永久| 日韩精品免费在线视频观看| 欧美一区在线直播| 国产精品第一页在线| 国产亚洲欧美日韩一区二区| 国产综合在线看| 亚洲四色影视在线观看| 欧美午夜性色大片在线观看| 国产亚洲福利一区| 日韩精品在线视频美女| 欧美最猛性xxxxx免费| 国产一区二区三区在线看| 国产精品视频xxxx| 粉嫩av一区二区三区免费野| 国产欧美日韩中文字幕在线| 尤物yw午夜国产精品视频明星| 亚洲精品乱码久久久久久按摩观| 国产在线观看不卡| 少妇高潮久久久久久潘金莲| 国产不卡视频在线| 亚洲成年网站在线观看| 日韩一区av在线| 伊人精品在线观看| 欧美丝袜一区二区| 国产精品久久91| 久热精品视频在线免费观看| 国a精品视频大全| 亚洲色图13p| 成人黄色免费片| 久久午夜a级毛片| 韩国福利视频一区| 国产成人精品电影久久久| 91久久综合亚洲鲁鲁五月天| 日韩电影在线观看永久视频免费网站| 国产在线播放不卡| 欧美一级bbbbb性bbbb喷潮片| 亚洲色图18p| 热久久免费视频精品| 国产欧美久久久久久| 国产一区二区三区网站| 日韩av网站在线| 久久精品国产99国产精品澳门| 久久夜色精品国产欧美乱| 亚洲成人1234| 日韩精品在线视频美女| 亚洲片在线资源| 欧美www视频在线观看| 中文字幕久精品免费视频| 国产精品男女猛烈高潮激情| 九九热精品在线| 97香蕉超级碰碰久久免费的优势| 国产精品扒开腿做爽爽爽男男| 亚洲老头同性xxxxx| 性欧美在线看片a免费观看| 久久福利网址导航| 国产精品色午夜在线观看| 91精品国产自产在线观看永久| 日韩在线视频网| 久久免费精品日本久久中文字幕| 国产欧美精品日韩精品| 欧美日韩成人在线播放| 91青草视频久久|