Как сохранить один и тот же идентификатор сеанса в нескольких веб-приложениях в ASP.NET - PullRequest
7 голосов
/ 09 июля 2010

У меня есть два идентичных приложения, настроенные на IIS в разных виртуальных каталогах (я сделал несколько обходных путей, чтобы убедиться, что у них обоих одинаковое имя приложения). Есть ли способ поделиться идентификатором сессии между двумя веб-приложениями asp.net?

Поскольку я храню сеанс в StateServer, они оба должны получать одни и те же данные сеанса, однако каждый раз, когда я перехожу из приложения a в приложение b, создается разный идентификатор сеанса. Разве это не произойдет и в сценарии балансировки нагрузки? Когда, когда я захожу на www.test.com, он перенаправляет этот запрос на сервер a, а затем, если я нажимаю его снова, он переходит на сервер b, но, поскольку это другое веб-приложение, оно создает новый идентификатор сеанса ?

Ответы [ 3 ]

7 голосов
/ 09 июля 2010

Сначала настройте элемент 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.

1 голос
/ 23 июля 2013

Изначально я столкнулся с той же проблемой.Что я сделал, так это переопределил идентификатор jsession для каждого домена.Я имею в виду, если пользователь попадает на domain1.com, установите тот же идентификатор сеанса для domain2.com из iframe.и наоборот.Благодаря этому вы можете поддерживать один и тот же сеанс в нескольких доменах.

Необходимо проверить влияние на несколько серверов по сети с помощью балансировщика нагрузки.

0 голосов
/ 09 июля 2010

Ваша цель - разделить состояние сеанса между двумя приложениями, а не только по идентификатору сеанса? Я полагаю, что StateServer также использует путь к приложению и SessionID для хранения данных, поэтому, даже если SessionID были одинаковыми, вы все равно не сможете обмениваться данными. Возможно, вам придется написать свой собственный сеансовый модуль.

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

...