Session 共享(StateServer模式)(原創)


Session 共享要注意兩點:

1、必須在同一個域名下

2、StateServer模式是把session保存在同一台服務器上的進程:aspnet_state.exe里面,當然也可以保存在memcache和數據庫里,這個下一節再講。

 

web.config設置:

 <machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>
	  <sessionState cookieless="false" timeout="50" mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424"/>
	  <httpModules>
		  <add name="CrossDomainCookieModule" type="Entity.SessionProviderHttpModule, Entity"/>
	  </httpModules>

tcpid的42424是默認端口

 

統一sessionid


要想共享session,就得把sessionid統一,sessionid是保存在cookie里ASP.NET_SessionId

public class SessionProviderHttpModule : IHttpModule
    {
        private string m_RootDomain = string.Empty;
        
        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            Sites sites = new Sites();
            m_RootDomain = sites.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++)
            {
                if (app.Context.Response.Cookies[i].Name == "ASP.NET_SessionId")
                {
                    app.Context.Response.Cookies[i].Domain = m_RootDomain;
                }
            }
        }
    }
}

 

這樣就可以實現session共享了。

 


免責聲明!

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



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