1. 程式人生 > >SqlServer Session共享註意點

SqlServer Session共享註意點

lan 進行 這一 多個 光有 sin 環境 運行 pla

公司下派任務,之前的網站是一臺服務器,由於用戶過多,負載過大,現在老大要求多加一臺服務器。加就加貝,應該跟我這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的方法。

  首先,你得建立這個Sqlserver數據庫。cmd命令。C:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe -S jpmsnmdb05t - E -d AWBUISession -ssadd -sstype c

  命令不懂的看我文中的鏈接。很簡單。

  然後,在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"/>

  到了這一步你在代碼裏面設置Session["name"]="value"的話,他就會將你的信息保存在SqlServer你建立的數據庫中Session表中。

讀取的話,我是這樣設置的,從客戶端獲得SessionId,然後根據這個SessionId到表裏面查詢,查到的數據反編譯出來就可以了,不懂得可以看看我的附件,我寫了一個用戶登錄測試系統。

  當中我遇到了一個問題,就是我不會建立測試環境。光有兩臺機器。你要記住,SessionId是cookie信息,那麽不同的domain(就是URL)他的SessionId是不同的,所以你要建立多個服務器共享一個session的話,一定要建立一個相同的domain。這樣你就可以隨心所欲訪問那一臺服務器了,舉個例子:比如用戶登錄時訪問了第一臺服務器,登錄好後,服務器切換到第二臺服務器了,用戶當然不知道,用戶還在繼續訪問頁面,系統肯定要檢測一下是不是用戶登錄了,不然得讓用戶登錄去,好,你得看看Session裏面的信息吧,根據SessionId得到信息?若是domain不同,你的SessionId不同,現在你的SessionId已經不是之前的那個了,你肯定在懷戀你登錄第一臺服務器的SessionId。若是你設置同一個domain的話,好,你無論訪問多少臺機器,你的SessionId是一個,那麽取出用戶信息還不是小case。好,如何建立一個相同的domian:

  設置本地的host,本地host路徑在哪?我問同事的,我也不是很清楚了,C:\Windows\System32\drivers\etc

  很簡單,你知道你的服務器IP地址吧。那麽只要修改你的host文件,看

    172.23.126.137 SessionTest # source server
10.168.109.120 SessionTest # x client host

  這是我添加的,兩臺服務器,同一個domain:SessionTest

   由於我把系統發布到服務器IIS的時候設置的端口號是8078,所以我只要在本地訪問http://sessiontest:8078/就好了。

   手動的開/關IIS裏面的站點進行切換服務器。

   這樣測試的環境也弄好啦。

   有個沒有解決的問題,若是有讀者涉及到也可以交流一下,在本地運行我的VS,訪問頁面,沒有任何的問題,

若是把系統放到服務器上面,我發現,當我取Session信息的時候,存放Session數據庫表中滿足我頁面搜索條件的只有一條,但是它卻出現了兩條,這兩條SessionId,前一大半是一樣的,跟HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value 是一樣的。HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value這個值,居然跟我ASPStateTempSessions表裏面的SessionId不一樣。我的HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value只是ASPStateTempSessions表裏面的SessionId的一半。看下圖,

HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value :x0if3uuddqmpl4451jberf2h

ASPStateTempSessions表裏面的SessionId:x0if3uuddqmpl4451jberf2h077b2520

SqlServer Session共享註意點