Как разделить сессию между разными веб-сайтами (разные сервера) - PullRequest
2 голосов
/ 13 мая 2019

Как часть требования, мне нужно разделить один сеанс между двумя разными приложениями (размещенными на разных машинах) в другой области. ( ex: app1.domain.com и app2.domain.com)

Я использую управление сессиями Sql Server, и оба приложения указывают на один и тот же сервер для хранения сессий. В обоих веб-приложениях ключ компьютера определен одинаково, и оба веб-сервера указывают на один и тот же сервер, где я использую службу State Server для управления сеансом.

Но когда я перенаправляю из одного приложения в другое, я не могу прочитать значение сеанса во втором приложении, которое инициируется в первом приложении. Нужны ваши предложения. Спасибо!

Ниже приведены изменения, которые я делаю на web.config обоих приложений:

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

Также в методе Init () в Global.asax я преобразую имя домена приложения в одно имя, чтобы сеанс можно было разделить между двумя приложениями. (этот метод написан на обоих приложениях

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);
                            }
                        }
                    }
                }
            }
        }
...