關於多臺機器以前session共享,sessionState mode="StateServer" 問題的困擾

.net 多臺機器共享session是很老的技術,一直不多用到session。html

最近就出現了一個問題:三臺前端,其中一臺保存的session值死活不對,同樣的環境,同樣的配置文件,就是和另外兩臺得到的值不一樣(值老是等於每次訪問這臺機器時,執行寫session操做的值)。前端

網上也搜了很多資料,不是什麼詳解,就是大全,找了很久(難道真的RP問題),終於發現解決方案,總結一下,給有須要的同窗。web

 

作好如下配置:服務器

在web.config下,<system.web>節點下插入配置cookie

<sessionState cookieName="DotNetAuth" mode="StateServer" stateConnectionString="tcpip=你的服務器IP(通常是內網):42424" cookieless="false" timeout="30" />

啓動 Asp.Net Session Service 服務,在註冊表 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters] 配置端口(Port,默認是42424),和容許遠程鏈接(AllowRemoteConnection,默認是0,0-不容許,1-容許)session

注:作好以上配置,不必定就能夠成功共享session。由於你在IIS上建立的網站標識可能會不一樣,標識不一樣機器之間session是不能共享的(固然你運氣好到爆,我也沒話說)。app

解決方案一:有條件的同窗,能夠保持三臺服務器IIS上的站點標識ID都是同樣(網站建立好,再修改不行,必定要建立時就是相同的標識ID),這樣能夠確定三臺機器的session之間是能夠共享的less

解決方案二:將園裏的一段代粘貼到global.asax中,也能夠解決(來至:http://www.cnblogs.com/cardgames/articles/3399546.htmltcp

public override void Init()
        {
            base.Init();
            foreach (string moduleName in this.Modules)
            {
                string appName = "APPNAME";
                IHttpModule module = this.Modules[moduleName];
                SessionStateModule ssm = module as SessionStateModule;
                if (ssm != null)
                {
                    FieldInfo storeInfo = typeof(SessionStateModule).GetField("_store", BindingFlags.Instance | BindingFlags.NonPublic);
                    SessionStateStoreProviderBase store = (SessionStateStoreProviderBase)storeInfo.GetValue(ssm);
                    if (store == null)//In IIS7 Integrated mode, module.Init() is called later
                    {
                        FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic);
                        HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);
                        FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", BindingFlags.Instance | BindingFlags.NonPublic);
                        appNameInfo.SetValue(theRuntime, appName);
                    }
                    else
                    {
                        Type storeType = store.GetType();
                        if (storeType.Name.Equals("OutOfProcSessionStateStore"))
                        {
                            FieldInfo uribaseInfo = storeType.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic);
                            uribaseInfo.SetValue(storeType, appName);
                        }
                    }
                }
            }
        }

 

另附上一些參考資料:ide

sessionState詳解:http://www.cnblogs.com/tangge/archive/2013/09/10/3312380.html

MSDN官方文檔:https://msdn.microsoft.com/zh-cn/library/h6bb9cz9(VS.80).aspx

說說Asp.net的StateServer和Session共享:http://blog.csdn.net/ahywg/article/details/39232809

相關文章
相關標籤/搜索