溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Session服務(wù)器如何配置

發(fā)布時(shí)間:2021-10-13 09:24:36 來(lái)源:億速云 閱讀:116 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)Session服務(wù)器如何配置的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

一.摘要
所有Web程序都會(huì)使用Session保存數(shù)據(jù). 使用獨(dú)立的Session服務(wù)器可以解決負(fù)載均衡場(chǎng)景中的Session共享問(wèn)題.本文介紹.NET平臺(tái)下建立Session服務(wù)器的幾種辦法, 并介紹在使用Session時(shí)的各種經(jīng)驗(yàn)和技巧.

二.關(guān)于Session,SessionID和Cookies
Session數(shù)據(jù)保存在服務(wù)器端, 但是每一個(gè)客戶端都需要保存一個(gè)SessionID, SessionID保存在Cookies中, 關(guān)閉瀏覽器時(shí)過(guò)期.

在向服務(wù)器發(fā)送的HTTP請(qǐng)求中會(huì)包含SessionID, 服務(wù)器端根據(jù)SessionID獲取獲取此用戶的Session信息.
很多初級(jí)開(kāi)發(fā)人員不知道SessionID和Cookies的關(guān)系, 所以常常認(rèn)為兩者沒(méi)有聯(lián)系. 這是不正確的. 正是因?yàn)镾essionID保存在Cookies中, 所以在我們保存Cookies的時(shí)候,一定要注意不要因?yàn)镃ookies的大小和個(gè)數(shù)問(wèn)題而導(dǎo)致SessionID對(duì)象. 在我們的程序中, 對(duì)SessionID的Cookies有特殊的處理:

復(fù)制代碼 代碼如下:


      /// <summary>
        /// 寫(xiě)入cookie.
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        public bool SetCookie(int day)
        {
            string CookieName = GetType().ToString();
            HttpCookie SessionCookie = null;
            //對(duì) SessionId 進(jìn)行備份.
            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總數(shù)超過(guò)20 個(gè), 重寫(xiě)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服務(wù)器的幾種方式
將Session保存在獨(dú)立的服務(wù)器中可以實(shí)現(xiàn)在多臺(tái)Web服務(wù)器之間共享Session.雖然我們也可以自己開(kāi)發(fā)Session存儲(chǔ)系統(tǒng), 但是使用ASP.NET自帶的存儲(chǔ)機(jī)制將更加便捷.
.NET提供了5種保存Seission的方式:

方式名稱

存儲(chǔ)方式性能

Off

設(shè)置為不使用Session功能

無(wú)

InProc

設(shè)置為將Session存儲(chǔ)在進(jìn)程內(nèi),就是ASP中的存儲(chǔ)方式,這是默認(rèn)值。

性能最高

StateServer

設(shè)置為將Session存儲(chǔ)在獨(dú)立的狀態(tài)服務(wù)中。通常是aspnet_state.exe進(jìn)程.

性能損失10-15%

SQLServer

設(shè)置將Session存儲(chǔ)在SQL Server中。

性能損失10-20%

Customer

自定制的存儲(chǔ)方案

由實(shí)現(xiàn)方式確定

我們可以在Web.Config中配置程序使用的Session存儲(chǔ)方式.默認(rèn)情況下是InProc, 即保存在IIS進(jìn)程中. 關(guān)于Off, InProc和Customer本文不做講解. 相關(guān)文章大家都可以在網(wǎng)上搜索到.
下面主要講解 StateServer 和 SQLServer 的應(yīng)用.

四.使用 StateServer 模式搭建Session服務(wù)器
(1)服務(wù)器端配置
1.啟動(dòng) Asp.net State service服務(wù).(這個(gè)服務(wù)默認(rèn)的狀態(tài)為手動(dòng).修改為自動(dòng)并啟動(dòng).)
2.修改注冊(cè)表: [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\aspnet_state\Parameters]
設(shè)置 AllowRemoteConnection = 1 , 設(shè)置 Port = 42424 (十進(jìn)制,默認(rèn)即為42424)
Port是服務(wù)的端口號(hào)
AllowRemoteConnection 表示是否允許其他機(jī)器連接,0為僅能本機(jī)使用,1為可以供其他機(jī)器使用.

(2)客戶端設(shè)置
在Web應(yīng)用程序的Web.Config中, 我們需要修改 <configuration> / <system.web> 的<sessionState>節(jié)點(diǎn).如果沒(méi)有
沒(méi)有則添加(默認(rèn)使用的是InProc方式)

復(fù)制代碼 代碼如下:


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


上面的參數(shù)我們可以根據(jù)需要修改.

五.使用SqlServer模式搭建Session服務(wù)器
(1)服務(wù)器端配置
使用SqlServer模式搭建Session服務(wù)器端有兩種方式. ASP.NET 1.0和1.1版本請(qǐng)使用方式a, 2.0即以上版本請(qǐng)使用方式b.

a.使用SQL文件創(chuàng)建Session數(shù)據(jù)庫(kù)
在ASP.NET 1.0和1.1 版本中, 只能使用這種方式.對(duì)于2.0及其以上版本,請(qǐng)使用aspnet_regsql.exe工具.(當(dāng)然此方法也通用2.0版本)
.net提供了數(shù)據(jù)庫(kù)安裝腳本,可以在機(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兩個(gè)版本,可以在不同的版本文件夾找到這兩個(gè)SQL.
InstallSqlState.sql 是創(chuàng)建默認(rèn)名稱的數(shù)據(jù)庫(kù)"[ASPState]".此SQL可以直接運(yùn)行.
InstallSqlStateTemplate.sql 可以使用自己指定的數(shù)據(jù)庫(kù)保存數(shù)據(jù).此SQL需要自己修改后運(yùn)行, 打開(kāi)SQL文件將其中 [DatabaseNamePlaceHolder] 替換為自己指定的數(shù)據(jù)庫(kù)名稱.
執(zhí)行installsqlstate.sql時(shí)不需要指定數(shù)據(jù)庫(kù),可以在任意數(shù)據(jù)庫(kù)上執(zhí)行.此SQL會(huì)自己創(chuàng)建新的數(shù)據(jù)庫(kù)

b. 使用aspnet_regsql.exe工具
ASP.NET 2.0版本后微軟提供了aspnet_regsql.exe工具可以方便的配置Session數(shù)據(jù)庫(kù).該工具位于 Web 服務(wù)器上的"系統(tǒng)根目錄\Microsoft.NET\Framework\版本號(hào)"文件夾中.
使用舉例:
aspnet_regsql.exe -S . -U sa -P 123456 -ssadd -sstype p
-S參數(shù):
表示數(shù)據(jù)庫(kù)實(shí)例名稱. 可以用"."表示本機(jī).
-U和-P參數(shù):
表示用戶名和密碼.
-E參數(shù):
可以再-U –P 與 -E中選擇一組. –E表示以當(dāng)前系統(tǒng)用戶通過(guò)windows身份驗(yàn)證登錄數(shù)據(jù)庫(kù), -U -P則是使用SqlServer用戶登錄數(shù)據(jù)庫(kù).
-ssadd / –ssremove 參數(shù):
-ssadd表示是添加Session數(shù)據(jù)庫(kù), -ssremove表示移除Session數(shù)據(jù)庫(kù).
sstype 參數(shù):

選項(xiàng)

說(shuō)明

t

將會(huì)話數(shù)據(jù)存儲(chǔ)到 SQL Server tempdb 數(shù)據(jù)庫(kù)中。這是默認(rèn)設(shè)置。如果將會(huì)話數(shù)據(jù)存儲(chǔ)到 tempdb 數(shù)據(jù)庫(kù)中,則在重新啟動(dòng) SQL Server 時(shí)將丟失會(huì)話數(shù)據(jù)。

p

將會(huì)話數(shù)據(jù)存儲(chǔ)到 ASPState 數(shù)據(jù)庫(kù)中,而不是存儲(chǔ)到 tempdb 數(shù)據(jù)庫(kù)中。

c

將會(huì)話數(shù)據(jù)存儲(chǔ)到自定義數(shù)據(jù)庫(kù)中。如果指定 c 選項(xiàng),則還必須使用 -d 選項(xiàng)包括自定義數(shù)據(jù)庫(kù)的名稱。

(2)Session客戶端設(shè)置
此房是同樣需要Web應(yīng)用程序修改Web.Config中的<sessionState>節(jié)點(diǎn).如果使用默認(rèn)的數(shù)據(jù)庫(kù)(ASPState庫(kù)), 則配置如下:

復(fù)制代碼 代碼如下:


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


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

復(fù)制代碼 代碼如下:


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


六.使用經(jīng)驗(yàn)與技巧總結(jié)
下面是SessionID, Session_End時(shí)間, StatServer模式 和 SqlServer模式的各種經(jīng)驗(yàn)和技巧總結(jié).
(1)StateServer模式:
1.在web farm中,請(qǐng)確認(rèn)在所有的web服務(wù)器上有相同的<machineKey>
2. 要保存在Session中的對(duì)象是可序列化的。
3.為了在web farm中的不同web服務(wù)器上維護(hù)session state,IIS Metabase中的網(wǎng)站應(yīng)用程序路徑(如\LM\W3SVC\2)應(yīng)該在所有的服務(wù)器上保持一致(大小寫(xiě)敏感).
4. ASP.NET處理Session是在Machine.Config中配置的HttpModuel模塊, 在.NET的安裝目錄下的Config文件夾中, 查看Web.Config(1.1版本是在Machine.Config):

復(fù)制代碼 代碼如下:


       <httpModules>
            ...            <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
            ...        </httpModules>


確認(rèn)此模塊是否存在.
5.StateServer不支持負(fù)載均衡, 所以如果大并發(fā)推薦使用SqlServer模式, 可以享受到SqlServer的高性能和安全性.雖然存儲(chǔ)效率會(huì)有下降.
6.需要讓所有機(jī)器的MachineKey相同.在Machine.Config中配置:

復(fù)制代碼 代碼如下:


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


(2)SqlServer模式:
1. 要保存在Session中的對(duì)象是可序列化的。
2. 如果使用了默認(rèn)是數(shù)據(jù)庫(kù), 則在客戶端配置文件中的數(shù)據(jù)庫(kù)鏈接字符串的用戶,需要擁有ASPState和tempdb兩個(gè)庫(kù)的dbowner權(quán)限.
3. 在SQLServer模式下,session過(guò)期是由SQL Agent使用一個(gè)注冊(cè)任務(wù)完成的,要確認(rèn)SQL Agent已經(jīng)運(yùn)行。否則無(wú)法清理過(guò)期的Session數(shù)據(jù), 會(huì)導(dǎo)致數(shù)據(jù)庫(kù)數(shù)據(jù)一直增加.
4. 如果使用SqlServer模式時(shí), 對(duì)于Web場(chǎng)中的各服務(wù)器的 ASP.NET 應(yīng)用程序路徑必須是相同的。請(qǐng)?jiān)?IIS 配置數(shù)據(jù)庫(kù)中對(duì) Web 場(chǎng)中的所有 Web 服務(wù)器進(jìn)行 Web 站點(diǎn)的應(yīng)用程序路徑同步。大小寫(xiě)一定要相同,因?yàn)?Web 站點(diǎn)的應(yīng)用程序路徑是區(qū)分大小寫(xiě)的。
5.需要讓所有機(jī)器的MachineKey相同.在Machine.Config中配置:

復(fù)制代碼 代碼如下:


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


(3)Session:
1. 不能直接通過(guò)Session服務(wù)器在ASP.NET和ASP之間共享Session. 請(qǐng)使用微軟提供的解決方案:
http://msdn.microsoft.com/zh-cn/library/aa479313.aspx
2. 在不同的應(yīng)用程序或一個(gè)網(wǎng)站的不同虛擬目錄之間無(wú)法共享Session
3. Session的過(guò)期時(shí)間是滑動(dòng)時(shí)間.
4. Session存儲(chǔ).NET自帶的值類型性能最優(yōu). 存儲(chǔ)對(duì)象會(huì)降低性能.
(4)SessionID:
1.SessionID 還可以保存在URL上, 設(shè)置Web.Config文件中的System.Web/sessionState節(jié)點(diǎn)的Cookiesless屬性即可:

復(fù)制代碼 代碼如下:


 <sessionState
      cookieless="UseUri"
      />


2. 一般在Session超時(shí)或刪除之后,SessionID保持不變. 因?yàn)镾ession過(guò)期后會(huì)在服務(wù)器端清除數(shù)據(jù), 但是SessionID保存在用戶瀏覽器上, 所以只要瀏覽器不關(guān)閉則HTTP頭中的SessionID保持不變.
3.關(guān)閉瀏覽器后再訪問(wèn), SessionID會(huì)不同.
4.每打開(kāi)一個(gè)IE6窗口, SessionID都不同, 在IE6中兩個(gè)窗口的Session不能共享.
5.FireFox的標(biāo)簽頁(yè)和新的FireFox窗口, SessionID都相同, 在FF的窗口和標(biāo)簽頁(yè)上Session能共享.
6.對(duì)于包含F(xiàn)rameSet的頁(yè)面,比如:

復(fù)制代碼 代碼如下:


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


如果后綴名是.htm并且.htm文件沒(méi)有交給ASP.NET的ISAPI處理, 那么根據(jù)服務(wù)器速度在每個(gè)Frame頁(yè)面生成不同的SessionID, 再刷新后相同都等于最后一個(gè)SessionID.
解決辦法是將.htm后綴改成.aspx, 或者將.htm文件交給ASP.NET的ISAPI處理. 
(5)Session_End事件:
1. Session_End僅在InProc模式中可用
2. 關(guān)閉瀏覽器,Session_End是不會(huì)觸發(fā)的。HTTP是一種無(wú)狀態(tài)協(xié)議,服務(wù)器沒(méi)有辦法知道你的瀏覽器是否已經(jīng)關(guān)閉。
3. 當(dāng)Session因?yàn)闀r(shí)間過(guò)期或調(diào)用Session.Abandon時(shí),Session_End才會(huì)觸發(fā).Session.Clear()僅僅是清除數(shù)據(jù),但沒(méi)有刪除session。
4. Session_End由一個(gè)后臺(tái)線程觸發(fā),使用工作者進(jìn)程賬號(hào)運(yùn)行. 所以程序不會(huì)通知發(fā)生的錯(cuò)誤.
5. 在Session_End訪問(wèn)數(shù)據(jù)庫(kù)要考慮權(quán)限問(wèn)題. Session_End是用運(yùn)行工作者進(jìn)程(aspnet_wp.exe)的帳號(hào)運(yùn)行的,這個(gè)賬號(hào)可以在machine.config中指定。因此,在Session_End中,如果使用integrity security連接SQL,它將使用工作者進(jìn)程賬號(hào)身份連接,這可能會(huì)引起登錄失敗.
6.因?yàn)镾ession_End是有獨(dú)立線程出發(fā)的, 所以在Session_End中無(wú)法使用HttpContext對(duì)象(Request,Response,Server等對(duì)象都在HttpContext中),  即無(wú)法使用 Response.Redirect 和Server.Transfer等方法.

感謝各位的閱讀!關(guān)于“Session服務(wù)器如何配置”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI