需求:
公司下派任務,之前的網站是一台服務器,由於用戶過多,負載過大,現在老大要求多加一台服務器。加就加貝,應該跟我這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
我的測試代碼需要的話,回復我一下,告訴我你的郵箱,我的測試系統是一個用戶登錄。
有什么問題可以及時回復。
我遇到的問題有同感的可以交流一下。