Совместное использование сеанса между двумя веб-сайтами с использованием asp.net и сервера состояний - PullRequest
11 голосов
/ 09 августа 2010

У меня есть два совершенно одинаковых веб-сайта, размещенных на двух разных машинах под IIS 7.5. Служба состояний ASP.NET работает на моем компьютере, и файл web.config обновляется на обоих сайтах следующим кодом:

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

В реестре разрешено удаленное подключение, равное 1, чтобы второй веб-сайт имел доступ к серверу состояний.

Оба веб-сайта имеют один и тот же машинный ключ:

<machineKey validationKey="7CB8DF6872FB6B35DECD3A8F55582350FEE1FAB9BE6B930216056C1B5BA69A4C5777B3125A42C4AECB4419D43EC12F168FD1BB887469798093C3CAA2427B2B89" decryptionKey="02FC52E4C71544868EE297826A613C53537DF8FDAF93FA2C64E9A5EF0BA467FB" validation="SHA1" decryption="AES" />

Кроме того, оба сайта настроены в IIS для одинакового идентификатора.

Что я хочу сделать, так это чтобы оба этих сайта использовали одни и те же данные сеанса, например, для следующих действий:

// At web site 1: 
Session["key"] = "value"

и

// At web site 2:
// Read session value from the other web site
string result = Session["key"]

Проблема в том, что я не могу выполнить этот тест и действительно не могу понять, что я делаю неправильно.

Есть идеи, которые могут помочь?

Ответы [ 3 ]

12 голосов
/ 22 марта 2016

Мне известно, что на этот вопрос был дан ответ 5 лет назад, но сегодня я думаю, что могу добавить в него еще немного информации.

Во-первых, это не официальный способ обмена данными сеанса между двумя приложениями IIS или самый популярный способ. «Казалось бы, официальный» способ - использовать сеанс SQL Server .

Если по какой-либо причине вы не можете использовать сервер SQL, мы можем немного настроить приложения IIS, чтобы мы могли использовать сеанс вне процесса, известный как StateServer режим состояния сеанса.

Чтобы все заработало, нужно сделать несколько вещей правильно:

  1. Сеансовый cookie-файл 2 приложений должен быть установлен для одного доменного имени. Э.Г.
<httpCookies domain=".your.site"/>
  1. Ключ машины должен совпадать. Вы можете сделать стандартное шифрование Web.config , чтобы сделать его более безопасным, но это необязательно.
<machineKey validationKey="[your_key]" 
    decryptionKey="[your_decryption_key]" validation="SHA1" />
  1. Режим состояния сеанса установлен на состояние сервера

Соединение (1), (2), (3) вместе:

<system.web>
    <httpCookies domain=".your.site"/>
    <machineKey validationKey="your_key" decryptionKey="your_decryption_key" validation="SHA1" />
    <sessionState mode="StateServer" timeout="60" />
    ...
  1. Имя приложения должно совпадать . Если нет, то можно использовать только идентификатор сеанса, но не данные сеанса. Проблема в том, что вы не можете настроить имя вашего приложения в Web.config. Тем не менее, мы можем создать нашу собственную конфигурацию, а затем внедрить ее с помощью отражения. Просто поместите следующий код в Global.asax.cs:

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

    Кредиты идут на pfemiani , Ли Чен , и кто-то, кого я не могу вспомнить, кто собирал это вместе в комментарии проекта кода. Обратите внимание, что ответ pfemiani не работает для меня, но в сочетании с постом Ли Чена это так.

  2. Убедитесь, что Служба состояний ASP .NET запущена. Это место, где данные сеанса будут сохранены сейчас.

4 голосов
/ 10 августа 2010

Вам потребуется способ убедить ваш браузер отправлять один и тот же файл cookie сеанса ASP.NET независимо от того, какой сайт он посещает.

Если файл cookie отсутствует в запросе, то новый сеансбудет создан с этим ключом.

Я думаю, вы можете заставить браузер сохранять ключ с некоторыми хитрыми DNS-конфигами - если вы назначите http://website1.mydomain.com/ и http://website2.domain.com/ в качестве адресовиз ваших сайтов, затем задайте для домена файла cookie сеанса ASP.NET значение «domain.com», после чего ваш браузер отправит его на оба сайта, и сеанс должен быть доступен для общего доступа.

Вы также можетеиспользуйте режим без файлов cookie с ASP.NET и извлеките идентификатор сеанса из сгенерированных URL-адресов.

0 голосов
/ 07 марта 2018

Совместное использование сеанса между двумя веб-приложениями asp.net

Пожалуйста, обратитесь ниже URL

http://www.freshcodehub.com/Article/48/sharing-session-between-two-aspnet-web-applications

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...