Как сохранить один и тот же идентификатор сеанса в нескольких веб-приложениях в ASP.NET
У меня есть два идентичных приложения, настроенные на IIS в разных виртуальных каталогах (я сделал несколько обходных путей, чтобы убедиться, что у них обоих одинаковое имя приложения). Есть ли способ поделиться идентификатором сессии между двумя веб-приложениями asp.net?
Поскольку я храню сеанс в StateServer, они оба должны получать одни и те же данные сеанса, однако каждый раз, когда я перехожу из приложения a в приложение b, создается разный идентификатор сеанса. Разве это не произойдет и в сценарии балансировки нагрузки? Когда, когда я захожу на www.test.com, он перенаправляет этот запрос на сервер a, а затем, если я нажимаю его снова, он переходит на сервер b, но, поскольку это другое веб-приложение, он создает новый идентификатор сеанса.?
3 ответа
Сначала настройте элемент sessionState в вашем web.config для использования cookieName="SOME_COOKIE_NAME_HERE" в обоих приложениях.
Затем просто убедитесь, что URL-адреса имеют одинаковый TLD (домен верхнего уровня), т.е. app1.mydomain.com и app2.mydomain.com, и вы должны иметь возможность обрабатывать событие Session_Start в Global.asax и поместить этот код:
HttpCookie cookie = new HttpCookie("SOME_COOKIE_NAME_HERE", Session.SessionID.ToString());
cookie.Expires = DateTime.Now.AddMinutes(20);
cookie.Domain = "*.mydomain.com";
cookie.HttpOnly = true;
Response.SetCookie(cookie);
Кроме того, я бы порекомендовал вам перейти в SqlServer SessionState Mode.
Первоначально я столкнулся с той же проблемой. Что я сделал, так это переопределил идентификатор jsession для каждого домена. Я имею в виду, если пользователь попадает на domain1.com, установите тот же идентификатор сеанса для domain2.com из iframe. и наоборот. Благодаря этому вы можете поддерживать один и тот же сеанс в нескольких доменах.
Вам необходимо проверить влияние на несколько серверов по сети с помощью балансировщика нагрузки.
Ваша цель - разделить состояние сеанса между двумя приложениями, а не только по идентификатору сеанса? Я полагаю, что StateServer также использует путь к приложению и SessionID для хранения данных, поэтому, даже если SessionID были одинаковыми, вы все равно не сможете поделиться данными. Возможно, вам придется написать свой собственный модуль сеанса.
В веб-приложениях с балансировкой нагрузки такой проблемы нет, поскольку путь к приложению одинаков для всех элементов кластера.