多站點共享Session常見的作法有:
使用.net自動的狀态服務(Asp.net State Service);
使用.net的Session資料庫;
使用Memcached。
使用Cookie方式實作多個站點間的共享(這種方式隻限于幾個站點都在同一域名的情況下);
這裡我們就 演練一下 以資料庫的形來存儲Session,來實作多站點共享Session。
首先我們 建好一下站點,如下圖:

Default.aspx
其中 有二個Button ,SetSession 主要是用于給一個 Session 指派(如:Session["ShareValue"] = “abcd”
) ,
GetSession 主要就是獲得 一個 Session 值。
具體代碼如下:
代碼部分就這麼多就行了…
下面就是要配置一下 Web.config了 , 其實主要就是在 <system.web>
這個節點中 增加 machineKey 及 sessionState 這兩個節點,
1.增加machineKey 主要作用是:
“按照MSDN的标準說法:“對密鑰進行配置,以便将其用于對 Forms 身份驗證 Cookie 資料和視圖狀态資料進行加密和解密,并将其用于對程序外會話狀态辨別進行驗證。”也就是說Asp.Net的很多加密,都是依賴于machineKey裡面的值,例如Forms 身份驗證 Cookie、ViewState的加密。預設情況下,Asp.Net的配置是自己動态生成,如果單台伺服器當然沒問題,但是如果多台伺服器負載均衡,machineKey還采用動态生成的方式,每台伺服器上的machinekey值不一緻,就導緻加密出來的結果也不一緻,不能共享驗證和ViewState,是以對于多台伺服器負載均衡的情況,一定要在每台站點配置相同的machineKey。“ ,具體可以查一下其它資料。
2.增加 sessionState 主要是讓 Session 儲存在資料庫中。
具體配置如下:
<machineKey validationKey="86B6275BA31D3D713E41388692FCA68F7D20269411345AA1C17A7386DACC9C46E7CE5F97F556F3CF0A07159659E2706B77731779D2DA4B53BC47BFFD4FD48A54"
decryptionKey="9421E53E196BB56DB11B9C25197A2AD470638EFBC604AC74CD29DBBCF79D6046"
validation="SHA1" decryption="AES"/>
<sessionState mode="SQLServer" sqlConnectionString="Data Source=PC-07195;Initial Catalog=AWBUISession;Persist Security Info=True;User ID=jins;Password=js@#$1234" allowCustomSqlDatabase="true" cookieless="false" timeout="100"/>
網站部分 這樣就好了。。。 下面就是要配置據庫了…..
資料庫配置:
使用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 選項包括自定義資料庫的名稱。
我的設定是:aspnet_regsql.exe -S . - E -d AWBUISession -ssadd -sstype c
好了。基本的 我們就已經搞定了。。
現在 我們分别把我們剛建的一個網站 部署 到 IIS 中。不過我們既然要負載。至少也的部署兩份。
我們把 其中一個 伺服器中的 defaut.aspx 中 “伺服器 1” 改成 “伺服器 2” ,這樣做的主要目地是 做一下 差別!
具體如下:
兩個網站的 URL分别是:
server 1:127.0.0.1:8081;
server 2:127.0.0.1:8080;
OK。下面我們就是 配置 Nignx了。
首先 在 nginx\conf 配置 檔案中找到 nginx.conf 這個檔案 ,就記事本打開,
做如上的 設定:
OK。 nginx 這樣配置 就算OK 了。 我們啟動一下 nginx ..
在浏覽器中 輸入我們 在 nginx 中配置的 URL 如:127.0.0.1:8090
我們會看到 伺服器 1 已經開始為我們服務了,我們再點一下 “SetSession”來設定一下一個 會話值,
我們會看到 伺服器 2 開始 工作。這時我們再點一下 “GetSesion”看一下 剛才在 伺服器 1 設定 的會話值,結果如下 :
出現這種情況 ,主要就是在資料庫中存儲 一個會話時 沒有做到 伺服器1 和服務2的Session 共享,主要是 在
ASPStateTempSessions 這個表中的 一個SessionID ,
其中的SessionId包括兩個部分:網站生成的24位SessionID及8位AppName對于不同的站點,其AppName不同,在能夠在不同站點下使24位SessionID相同的情況下,要保證經過組合加上AppName後的SessionID相同,可以通過修改存儲過程TempGetAppID,使其得到的SessionID與AppName無關,修改TempGetAppID如下:
ALTER PROCEDURE [dbo].[TempGetAppID]
@appName tAppName,
@appId int OUTPUT
AS
SET @appName = 'Test' --LOWER(@appName) 修改這裡,使多個站點的APPname ,為一個固定值。
SET @appId = NULL
SELECT @appId = AppId
FROM [AWBUISession].dbo.ASPStateTempApplications
WHERE AppName = @appName
IF @appId IS NULL BEGIN
BEGIN TRAN
SELECT @appId = AppId
FROM [AWBUISession].dbo.ASPStateTempApplications WITH (TABLOCKX)
WHERE AppName = @appName
IF @appId IS NULL
BEGIN
EXEC GetHashCode @appName, @appId OUTPUT
INSERT [AWBUISession].dbo.ASPStateTempApplications
VALUES
(@appId, @appName)
IF @@ERROR = 2627
BEGIN
DECLARE @dupApp tAppName
SELECT @dupApp = RTRIM(AppName)
FROM [AWBUISession].dbo.ASPStateTempApplications
WHERE AppId = @appId
RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.',
18, 1, @appName, @dupApp)
END
END
COMMIT
END
RETURN 0
經過以上修改之後,下面要實作多個站點共用同一個SessionID.
重新開機一下各站點。再在浏覽一下網站
點 “SetSession”,
再點:“GetSession”
這樣 我們就看到 伺服器2 給出了我們 剛才在 伺服器 1 中設定 的會話值了。
我們 再點:“GetSession”,
附加一點: Session 過期删除,主要是 在 SQL server 代理中的 作業完成。
具體的可以,查一下其它相關資料.