Почему я не могу совместно использовать Состояние сеанса между 2 веб-приложениями с StateServer? Что я пропускаю?

Я испытываю затруднения, заставляя 2 идентичных ASP.NET приложения MVC совместно использовать ту же Сессию с помощью Сессии StateServer. Причина, которую я пытаюсь сделать, это, мы будем в конечном счете развертывать это приложение через 3 веб-сервера, которые должны совместно использовать то же состояние. Мы должны использовать StateServer, потому что мы пытаемся минимизировать использование дб для не связанное с данными устройство хранения данных.

Установка:

Я развернул ту же кодовую базу на http://localhost/App1 и http://localhost/App2

у обоих есть идентичная сеть. Файлы конфигурации со следующим:



              //stateConnectionString="tcpip=192.168.1.52:42424" /> // also doesn't work

Я использовал этот инструмент для генерации этих ключей машины

Тест:

Я поместил следующее в один из моих Контроллеров, чтобы протестировать, если это работало:

ViewData["mode"] = requestContext.HttpContext.Session.Mode.ToString();

string timestamp = DateTime.Now.ToString();
if (requestContext.HttpContext.Session["timestamp"] == null)
{
    requestContext.HttpContext.Session["timestamp"] = timestamp;
}

ViewData["timestamp"] = requestContext.HttpContext.Session["timestamp"].ToString();
ViewData["realtime"] = timestamp;

с этим в представлении:

Mode: <%= ViewData["mode"].ToString() %>

Time: <%= ViewData["timestamp"].ToString() %>

real time: <%= ViewData["realtime"].ToString() %>

Результат:

Для обоих развертывания, когда страница сначала загружается I, видят, что режимом является StateServer, и метка времени становится установленной на то же время как значение в реальном времени.. Однако, если бы это работало, то только первая страница должна иметь то же время как значение в реальном времени. Вторая загрузка страницы должна читать из StateServer, потому что то значение метки времени больше не является нулевым, и отобразите ту временную стоимость. Но вместо этого, это отображает значение в реальном времени снова.

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

Кто-то может указать, делаю ли я что-то не так или если существует что-то еще, что я должен сделать, чтобы заставить это работать?Спасибо

11
задан DaveDev 20 July 2010 в 17:03
поделиться

3 ответа

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

Как всегда, есть обходные пути, которые вы можете найти полезными. Как вы можете видеть, это использование хака (отражения) для обхода решимости дизайнера команды ASP.NET не раскрывать определенные классы и свойства и усложнить нашу жизнь как разработчиков.

10
ответ дан 3 December 2019 в 05:33
поделиться

Обновление: вот предыдущее сообщение, на которое я отвечал по той же теме. Совместное использование сеансов между приложениями с использованием службы состояний сеансов ASP.NET

Как уже указывалось, данные сеанса привязаны к приложению. Это приложение, которое вы создаете в IIS.Таким образом, два приложения с одним и тем же идентификатором сеанса не будут использовать один и тот же сеанс из-за области действия приложения.

В качестве альтернативной идеи, которая может оказаться для вас осуществимой, а может и нет. Вы можете создать корневое приложение и иметь код для D: \ App1 и D: \ App2 в двух подпапках.

d:\Root
  web.config
  \App1
     default.aspx
     ...
  \App2
     default.aspx
     ...

Затем в IIS вы создаете приложение, указывающее на d: \ Root.

Вы также можете создать приложение в IIS, а затем в приложении вы создаете два виртуальных каталога, один из которых указывает на D: \ App1, а другой - на D: \ App2, тогда они также могут совместно использовать одну сеть. config на уровне приложения. Очень важно, чтобы два виртуальных каталога были просто виртуальными, а не создавались как приложения.

Итак, макет вашего жесткого диска может выглядеть примерно так.

D:\Root
  web.config

D:\App1
  default.aspx
  ...

D:\App2
  default.aspx
  ...

Создайте корневое приложение, указывающее на D: \ Root, а затем в приложении создайте два виртуальных каталога App1, указывающих на D: \ App1 и App2, указывающих на D: \ App2 .

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

3
ответ дан 3 December 2019 в 05:33
поделиться

Вы также должны убедиться, что путь приложения для приложения должен быть одинаковым на обоих веб-серверах. Здесь есть старая статья, которая может помочь

http://support.microsoft.com/default.aspx?scid=kb;EN-US;q325056

В настоящее время мы сталкиваемся с аналогичной проблемой, за исключением того, что мы с использованием IIS 7.5 и пути к приложениям скрыты от нас (больше не использует метабазу). Кто-нибудь знает способ решения этой проблемы с помощью IIS 7.5?

2
ответ дан 3 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: