.net多站点通过StateServer实现session共享

 

先在所有要共享站点web.config的<system.web>结点下加

<!--session的mode=StateServer-->
<
sessionState cookieless="false" timeout="50" mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424"/>
<!--机器码要统一--> <machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/> <httpModules>

  <add name="CrossDomainCookieModule" type="WebLibrary.CrossDomainCookie, WebLibrary"/> 
    </httpModules>

 

新建一个类库项目代码如下

using System.Web; 

using System; 

using System.Configuration; 

using System.Diagnostics; 

using System.Reflection; 

using System.Web.SessionState;   



namespace WebLibrary 

{

     public class CrossDomainCookie : IHttpModule

     {

         private string m_RootDomain = “http://localhost:8008/”;//主要共享的Session的URL,这里测试仪所以用locahlost,也可以用域名



         #region IHttpModule Members

         public void Dispose() 

         {  

         } 

         public void Init(HttpApplication context)

         {

             m_RootDomain = ConfigurationManager.AppSettings["RootDomain"];

             Type stateServerSessionProvider = typeof(HttpSessionState).Assembly.GetType("System.Web.SessionState.OutOfProcSessionStateStore");

             FieldInfo uriField = stateServerSessionProvider.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic); 



             if (uriField == null)

                 throw new ArgumentException("UriField was not found");



             uriField.SetValue(null, m_RootDomain); 



             context.EndRequest += new System.EventHandler(context_EndRequest);

         }

         void context_EndRequest(object sender, System.EventArgs e)

         {

             HttpApplication app = sender as HttpApplication;

             for (int i = 0; i < app.Context.Response.Cookies.Count; i++)

             {

                 app.Context.Response.Cookies[i].Domain = m_RootDomain; 

             }

         }

         #endregion

     }

 }

 

若StateServer为远程服务器不是127.0.0.1,则为IpAddress为远程服务器IP地址修改Session服务器注册表中的项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \aspnet_state\Parameters中的AllowRemoteConnection 键的值为1,其中的Port键控制ASP.NET State Service的监听端口;修改后需要重启ASP.NET State Service才生效;

你可能感兴趣的:(session共享)