如何在不同网站(不同服务器)之间共享会话

时间:2019-05-13 14:57:26

标签: c# asp.net session session-management

作为要求的一部分,我需要在不同域中的2个不同应用程序(托管在不同计算机上)之间共享一个会话。 ( ex: app1.domain.com和app2.domain.com)

我正在使用Sql Server会话管理,并且两个应用程序都指向同一台服务器来存储会话。在这两个Web应用程序中,机器密钥的定义相同,并且两个Web服务器都指向我正在运行状态服务器服务以进行会话管理的同一服务器。

但是,当我从一个应用程序重定向到另一个应用程序时,我无法读取在第一个应用程序中启动的第二个应用程序中的会话值。需要您的建议。谢谢!

下面是我在两个应用程序的web.config上所做的更改:

<sessionState mode="SQLServer" 
    cookieless="false" 
    timeout="20" 
    sqlConnectionString="data source= DESKTOP-565; initial catalog=ASPState; user id=sa; password=*********;" 
    allowCustomSqlDatabase="true" />

还在 Global.asax Init()方法中,我将应用程序域名转换为一个名称,以便可以在2个应用程序之间共享会话。 (此方法是在两个应用程序上编写的

public override void Init()
    {
        base.Init();
        try
        {
            // Get the app name from config file...
            string appName = "/lm/w3svc/5/root";
            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);
                            }
                        }
                    }
                }
            }
        }

0 个答案:

没有答案