Asp.net 多服務器 Session共享


需求:

  公司下派任務,之前的網站是一台服務器,由於用戶過多,負載過大,現在老大要求多加一台服務器。加就加貝,應該跟我這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
我將我的代碼放到這兩台服務器上面,然后我停掉一台服務器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設為一樣的就可以了。若是有不懂得可以問我,我最近在搞這個東西。

 

 

  

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM