為什么還是那句話,在網上找了N篇Session共享,但真正可以直接解決問題的還是沒有找到。
一、以下為本人親測,為防止環境不一致,對本文產生歧義,限定環境如下:
1. IIS7.0
2. Asp.net 的站點
3. StateServer模式,數據庫及自定義配置不在本文討論范圍。
4. 192.168.1.41 (主站點服務器,域名:www.xxx.com) ,192.168.1.43 (業務分發服務器 域名:BDN1.xxx.com)
5. 實現的跨域也只是跨子域的方法。(因為最終都是讀取根域下的Cookie來讀取SessonID共享的)
二、配置
主站點服務器web.config
1. <sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.41:42424" timeout="60"/>
將模式改為 StateServer ,默認是關閉遠程訪問,需要打開注冊表(regedit),HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters
將AllowRemoteConnection 改為 1 可以使用Telnet 192.168.1.41 42424 測試一下是否已經打開。
2. <httpCookies domain="xxx.com" />
將Cookie的Domain限定要根域名下,以使下一級的子域都可以訪問到這個Cookie.
另外提一下,如果你只是想讓Session在根域下,其他的Cookie另外設置,可以使用這樣的方法.
<sessionState sessionIDManagerType ="B2BSite.MySessionIDManager" mode="StateServer" stateConnectionString="tcpip=192.168.1.41:42424" timeout="60"/>
public class MySessionIDManager : SessionIDManager, ISessionIDManager { void ISessionIDManager.SaveSessionID(HttpContext context, string id, out bool redirected, out bool cookieAdded) { base.SaveSessionID(context, id, out redirected, out cookieAdded); if (cookieAdded) { var name = "ASP.NET_SessionId"; var cookie = context.Response.Cookies[name]; cookie.Domain = "xxx.com"; cookie.Path = "/"; } } }
3. <machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>
不同的機器會產生不一致的Session,所以需要指定MachineKey,來使不同的機器產生的Session可以相互讀取.
業務分發服務器web.config
1. <sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.41:42424" timeout="60"/>
tcpip=為主服務器的StateServerIP.你也可以獨立出來.我這邊是放在主服務器上了.
2. <httpCookies domain="xxx.com" />
3. <machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>
這個machinekey必須與主站點服務器的machinekey 一樣.
注:最后也是最關鍵的一點.很多文件都沒有提到,就是IIS 設置中站點的ID,兩個網站必須一樣,如果主站點服務器的站點ID是3,那么業務分發服務器的站點ID也必須是3.要不然就不可以訪問.我在這個地方卡了很久.MSDN上有說明的.