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

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

 

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

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

  

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

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

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

а также

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

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

Любая идея, которая может помочь?

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

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

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

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

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

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

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

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

  1. Сессионный файл cookie из 2-х приложений должен быть установлен с тем же именем домена. Например
  
  1. Ключ машины должен быть согласован. Вы можете использовать стандартное шифрование полей Web.config, чтобы сделать его более безопасным, но это необязательно.
  
  1. Режим состояния сеанса установлен на состояние сервера

Полагая (1), (2), (3) вместе:

     ... 
  1. Имя приложения должно совпадать . Если это не так, только общий идентификатор сеанса можно использовать совместно, но не данные сеанса. Проблема в том, что вы не можете настроить имя своего приложения внутри Web.config. Но мы можем создать свою собственную конфигурацию, а затем ввести ее reflectionм. Просто поставьте следующий код в 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 не работает для меня, но его сочетание с записью Ли Чена.

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

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

См. Ниже URL

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

Interesting Posts

Как я могу скопировать большое количество файлов с одной машины Ubuntu на другую эффективно?

Редактирование столбцов в Notepad ++ является удивительным. Как копировать / вставлять в режиме столбцов?

Кто-нибудь заменил экран macbook?

Есть ли вообще исключить артефакты, унаследованные от родительского ПОМ?

Какую структуру я должен использовать для написания модhive?

Поместить контент в объект HttpResponseMessage?

Как сравнивать CDI и EJB? взаимодействовать?

Субдомены для сервера за NAT

Распаковка файла .gz с помощью C #

Исключение при попытке выполнить «ЗАМЕНИТЬ» против доступа MS Access

Зарубежный прокси делает Google Chrome, думаю, я в Германии или Нидерландах

Как использовать Simple HTTP-клиент в Android?

Как отключить автоматическую настройку громкости микрофона?

Где определено соглашение об именах свойств JavaBean?

Время с момента последней разблокировки Windows 7

Давайте будем гением компьютера.