Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用asp.net和状态服务器在两个网站之间共享会话_C#_Asp.net_Iis_State - Fatal编程技术网

C# 使用asp.net和状态服务器在两个网站之间共享会话

C# 使用asp.net和状态服务器在两个网站之间共享会话,c#,asp.net,iis,state,C#,Asp.net,Iis,State,我有两个完全相同的网站,在IIS 7.5下托管在两台不同的机器上。 ASP.NET状态服务正在我的计算机上运行,两个站点中的web.config都用以下代码更新: <sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.77:42424" cookieless="false" timeout="120"/> 及 问题是我无法完成这个测试,也无法理解我做错了什么 有什么想法可能有用吗?您需要一种方

我有两个完全相同的网站,在IIS 7.5下托管在两台不同的机器上。 ASP.NET状态服务正在我的计算机上运行,两个站点中的web.config都用以下代码更新:

<sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.77:42424" cookieless="false" timeout="120"/>

问题是我无法完成这个测试,也无法理解我做错了什么


有什么想法可能有用吗?

您需要一种方法来说服浏览器发送相同的ASP.NET会话cookie,而不管它访问哪个站点

如果请求中不存在cookie,则将使用该密钥创建一个新会话

我认为你可以让浏览器通过一些狡猾的DNS配置来保留密钥-如果你分配和作为你站点的地址,然后将ASP.NET会话cookie的域设置为“domain.com”,那么你的浏览器将把它发送到两个站点,会话应该共享


您还可以在ASP.NET中使用无Cookie模式,并从生成的URL中获取会话ID。

我知道这个问题在5年前就得到了回答,但今天我想我可以在其中添加更多信息

首先,这不是两个IIS应用程序之间共享会话数据的官方方式,也不是最流行的方式。“貌似官方”的方式是

如果您出于任何原因无法使用SQL server,那么我们可以稍微调整IIS应用程序,以便使用进程外会话,即StateServer会话状态模式

要使其发挥作用,有很多事情需要纠正:

  • 2个应用程序的会话cookie必须设置在同一域名上。例如
  • 我不记得是谁在代码项目的评论中把它放在一起的。请注意,普菲米亚尼的回答对我来说并不适用,但将其与李晨的帖子结合起来就行了

  • 确保正在运行。它是现在保存会话数据的地方


  • 在两个asp.net web应用程序之间共享会话

    请参考以下网址


    我的问题是,我的两个应用程序使用的是Owin库的不同主要版本。一旦我确保两个应用程序之间的所有Owin库共享同一版本,我就可以通过遵循Hoáng Long发布的答案来实现这一点。

    因此,如果在Firefox中,我将ASP.NET_SessionId cookie更改为在两个URL中完全相同,例如,它可能会起作用。是吗?是的,我想是的。您还可以使用Fiddler覆盖请求上的cookie值。关于无cookie模式的警告:这是非常不安全的。会话ID在URL中,因此人们可以简单地获取它并以您的身份登录,而不需要任何用户/密码。这对我很有用。特别是第4点是其他SO答案中缺少的内容。
    <machineKey validationKey="7CB8DF6872FB6B35DECD3A8F55582350FEE1FAB9BE6B930216056C1B5BA69A4C5777B3125A42C4AECB4419D43EC12F168FD1BB887469798093C3CAA2427B2B89" decryptionKey="02FC52E4C71544868EE297826A613C53537DF8FDAF93FA2C64E9A5EF0BA467FB" validation="SHA1" decryption="AES" />
    
    // At web site 1: 
    Session["key"] = "value"
    
    // At web site 2:
    // Read session value from the other web site
    string result = Session["key"]
    
    <httpCookies domain=".your.site"/>
    
    <machineKey validationKey="[your_key]" 
        decryptionKey="[your_decryption_key]" validation="SHA1" />
    
    <system.web>
        <httpCookies domain=".your.site"/>
        <machineKey validationKey="your_key" decryptionKey="your_decryption_key" validation="SHA1" />
        <sessionState mode="StateServer" timeout="60" />
        ...
    
    public override void Init()
    {
        base.Init();
        try
        {
            // Get the app name from config file...
            string appName = ConfigurationManager.AppSettings["ApplicationName"];
            if (!string.IsNullOrEmpty(appName))
            {
                foreach (string moduleName in this.Modules)
                {
                    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);
                            }
                        }
                    }
                }
            }
    
        }
        catch (Exception ex)
        {
            log.Error(ex.Message, ex);
        }
    }