c# – 使用状态服务器在不同.NET版本之间共享会话状态

背景

>我们有一个网站运行在IIS 6(Win2003服务器)使用.NET 3.5:site1.mysite.local
>我们有一个使用.NET 4.0的IIS 7(Win2008服务器)上运行的第二个网站:site2.mysite.local

在每个站点上,web.config包含StateServer和同一个machineKey:

<sessionState mode="StateServer" stateConnectionString="tcpip=STATESRV01:42424" />

<machineKey decryptionKey="EDCDA6DF458176504BBCC720B4E29348E252E652591179E2" validationKey="CC482ED6B5D3569819B3C8F07AC3FA855B2FED7F0130F55D8405597C796457A2F5162D35C69B61F257DB5EFE6BC4F6CEBDD23A4112C4519F55185CB5EB3DFE61"/>

我们还有一个PostRequestHandlerExecute事件处理程序来修改“NET_SessionId”cookie以具有相同的根域和路径.

cookie.Domain = ".mysite.local";
cookie.Path = "/";

在global.asax文件中,我们有以下代码修改Application_Start事件中的App Name:

    protected void Application_Start(object sender, EventArgs e)
    {
        string applicationName = "mysiteapp";

        // Change the Application Name in runtime.
        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, applicationName);
    }

结果

两个站点返回相同的会话ID,但是当我们尝试在site1上设置会话值时,site2不返回值.

网站1(site1.mysite.local)结果

Session ID (Session.SessionID): a55jnfcscxd3f0hnwoik02pp
Session Value: True

站点2(site2.mysite.local)结果

Session ID (Session.SessionID): a55jnfcscxd3f0hnwoik02pp
Session Value: 

根据我的理解,状态服务器将会话结束从SessionID cookie,机器密钥和我们尝试更新的应用程序名称的组合中键入,使得它们在两个站点上都相同.问题是,会话值不在整个网站上共享.

为什么不使用SQL Server模式进行会话状态?

我们可能不得不,但我们希望使用我们的状态服务器.

有没有人在多台服务器上拥有多个Web应用程序的State Server?

.NET 3.5和.NET 4运行不同版本的CLR.对象序列化(用于在不使用InProc时存储会话状态)在.NET版本之间不同.很可能该对象未能在另一个平台上反序列化,因此它会静默地删除它.如果您使用SQL Server作为会话状态服务器,您也会遇到同样的问题.

假设这是问题,那么您将必须确保两个站点都在同一个.NET版本,或者执行自己的序列化到磁盘或SQL Server.

翻译自:https://stackoverflow.com/questions/12290992/sharing-session-state-between-different-net-versions-using-state-server

转载注明原文:c# – 使用状态服务器在不同.NET版本之间共享会话状态