需求:
公司下派任務,之前的網站是一台伺服器,由於使用者過多,負載過大,現在老大要求多加一台伺服器。加就加貝,應該跟我這DEV沒有
關係吧,應該不會碰到Source的吧。但是,之前網站有一些資料是放在Session裡面的。大家應該理解Sessino的機制(自己的理解):當使用者訪問伺服器的時候,會在Cookie裡面留下一個SessionId,HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value就能取到,然後伺服器會根據這個SessionId 來跟我伺服器這邊進行資料匹配,簡單說就是拿你的SessionId來取存放在我伺服器端的資料,類似於Key:Word。由於當一個用戶端訪問一個伺服器,存放在Session的資料是在伺服器端的,若是我加一台伺服器的話,這Session的資料就要共用出來,能夠讓我兩台機器同時訪問到。這樣,使用者訪問伺服器的時候,我切換伺服器機器就不會丟失Sesson裡面的資料了。
步驟
在網上搜了關於Session 共用的方法,http://www.cnblogs.com/xinhaijulan/archive/2010/08/21/1805116.html 有很多,我就選擇一個SqlServer共用Sessin的方法。
1。
首先,你得建立這個Sqlserver資料庫。cmd命令。C:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe -S jpmsnmdb05t - E -d AWBUISession -ssadd -sstype c
命令不懂的看我文中的連結。很簡單。
或者 運行C:\Windows\Microsoft.NET\Framework\v2.0.50727 裡面的 InstallPersistSqlState.sql(建立資料庫) UninstallPersistSqlState.sql(卸載)
2。
然後,在Asp.net 項目中的Web.config裡面<system.web>輸入
標籤裡面不懂也看連結
<machineKeyvalidationKey="1234567890123456789012345678901234567890AAAAAAAAAA"decryptionKey="123456789012345678901234567890123456789012345678"validation="SHA1"decryption="Auto"/>
<sessionStatemode="SQLServer"sqlConnectionString="server=jpmsnmdb05t; database=AWBUISession;Trusted_Connection=Yes; Persist Security Info=False;"allowCustomSqlDatabase="true"cookieless="false"timeout="100"/>
然後,在程式裡面進行Sesssion["test"]="test value" 或則取Session的內容看看,ok,都會將Session的資料放到我建立的資料庫裡面。
注意
若是按照我上面的配置還沒有成功的朋友,我只能說,你肯定犯錯了,請見下面對照一下:
1. 寫入Session的值一定要是可序列化的(我就碰到這個問題,把我搞死了,剛開始都不懂,看網上就說一句注意可序列化我也沒有注意,真正自己配置不成功的時候就哭吧)我來舉個例子,比如你建立了一個類User,當你Sesssion["User"]=new User("name","pwd"); 你要記住User類一定要序列化,不然你就永遠不會成功,如何序列化,很簡單在public class User上面添加一句話[Serializable()].記住所有的都要序列化,只要你向Session裡面設值了,因為系統會把你寫入Session 裡面的值進行序列化後存放到ASPStateTempSessions表裡面的。
2. 我自己配的測試環境,在http://www.cnblogs.com/xinhaijulan/archive/2010/08/21/1805116.html 我還問了別人如何配置,當時我也不清楚我建立的測試環境是不是正確的。
我的配置環境(下面是我問別人的話) :
不知道樓主能不能看到,實在是沒辦法了,都糾結好久了。
我按照你的方式進行配置,我目的是想多台伺服器共用session,利用Sql server。 我不知道我的測試方法對不對,我設定本地 host為 172.23.126.137 SessionTest # source server 10.168.109.120 SessionTest # x client host
我將My Code放到這兩台伺服器上面,然後我停掉一台伺服器IIS,然後訪問 http://sessiontest:8078/ 比如使用者登入功能,它會在SqlServer上面添加一條記錄。 然後我開啟這台,停掉另外一台,訪問Url,它還是使用者登入頁面,按道理應該是檢測使用者資訊成功,不會再次進行使用者登入的。 兩台伺服器IIS都是,8078連接埠,只是IP不同。 希望樓主能看到,希望....... 雖然樓主回答了我的問題,然而還是沒有看懂,但是還是非常感謝那位朋友,過了兩三天,我自己還是發現問題的原因: 我要提到一個問題,ASPStateTempSessions表裡面的SessionId其實是SessionId+AppId(佔8位). AppId是ASPStateTempSessions表裡面AppId的十六進位表示。我在網上看了好多資料,ASPStateTempSessions表裡面的AppId到底是什麼東西。無意中,我的測試人員提醒了我一下,我截個圖 ,如下,看到26沒有 。 我的ASPStateTempSessions表如下。 AppId APPName -1977566844 /lm/w3svc/26/root
只要你在多個伺服器裡面把ID設為一樣的就可以了。若是有不懂得可以問我,我最近在搞這個東西。