Обмен сессиями между приложениями с использованием службы состояния сессии ASP.NET
Я пытаюсь организовать совместное использование сессий между двумя веб-приложениями, размещенными на одном сервере. Одно из приложений — это .NET 2.0 Web Forms, а другое — .NET 3.5 MVC2.
Оба приложения настроены на использование сессий следующим образом:
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
/>
В приложении Web Forms я отправляю ключ сессии в приложение MVC следующим образом:
protected void LinkButton1_Click(object sender, EventArgs e)
{
Session["myvariable"] = "dan";
string sessionKey = HttpContext.Current.Session.SessionID;
// Здесь следует код, который отправляет sessionKey в другое приложение
}
Затем я получаю этот ключ в приложении MVC и пытаюсь использовать сессию так:
[HttpPost]
public void Recieve(string sessionKey)
{
var manager = new SessionIDManager();
bool redirected;
bool isAdded;
manager.SaveSessionID(HttpContext.ApplicationInstance.Context, sessionKey, out redirected, out isAdded);
var myVar = Session["myvariable"];
}
Ключ действительно отправляется, но сессия, похоже, не загружается в приложении MVC, то есть переменная myVar
оказывается равной null. Возможно ли реализовать то, что я пытаюсь сделать?
2 ответ(ов)
Проблема заключается в том, что ключи сессии ограничены конкретными приложениями, поэтому два приложения, использующие один и тот же ключ сессии, на самом деле имеют отдельные сессии.
Вы можете сделать одно из двух:
- Разместить оба приложения в виде виртуальной директории под общим приложением IIS. Я не думаю, что это хорошая идея, но оно будет работать.
- Создать собственное решение для управления данными сессии, которые вы хотите разделить. Возможно, стоит использовать базу данных на сервере в качестве общего хранилища, если она у вас есть.
Согласно комментарию Джастина, просто чтобы прояснить, что вариант 2 не подразумевает управление состоянием SQL для сессий вне процесса. Я имею в виду, что вам нужно самостоятельно управлять общими данными для двух сессий, возможно, с использованием базы данных.
Вы можете использовать общий ключ Machine для генерации одинакового идентификатора сессии (Session ID) в обеих приложениях для конкретного пользователя. Дополнительно следует запланировать хранение сессий обоих приложений в общем хранилище, таком как ASP.NET State Service или распределенном кэше.
Одним из вариантов является использование распределенного кэша NCache, который обеспечивает возможность совместного использования сессий между различными приложениями. Вы должны указать один и тот же тег Application ID для обоих приложений в настройках состояния сессии, что позволит вам обмениваться объектом сессии, при условии, что у вас сгенерирован одинаковый идентификатор сессии для обоих приложений.
Как создать выпадающий список из enum в ASP.NET MVC?
Как перенаправить всё, кроме Web API, на /index.html
Когда и зачем использовать TryUpdateModel в ASP.NET MVC 2?
Обнаружено потенциально опасное значение Request.Form, полученное от клиента
Таймаут при использовании Linq-to-SQL