0

Обмен сессиями между приложениями с использованием службы состояния сессии ASP.NET

16

Я пытаюсь организовать совместное использование сессий между двумя веб-приложениями, размещенными на одном сервере. Одно из приложений — это .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 ответ(ов)

0

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

Вы можете сделать одно из двух:

  1. Разместить оба приложения в виде виртуальной директории под общим приложением IIS. Я не думаю, что это хорошая идея, но оно будет работать.
  2. Создать собственное решение для управления данными сессии, которые вы хотите разделить. Возможно, стоит использовать базу данных на сервере в качестве общего хранилища, если она у вас есть.

Согласно комментарию Джастина, просто чтобы прояснить, что вариант 2 не подразумевает управление состоянием SQL для сессий вне процесса. Я имею в виду, что вам нужно самостоятельно управлять общими данными для двух сессий, возможно, с использованием базы данных.

0

Вы можете использовать общий ключ Machine для генерации одинакового идентификатора сессии (Session ID) в обеих приложениях для конкретного пользователя. Дополнительно следует запланировать хранение сессий обоих приложений в общем хранилище, таком как ASP.NET State Service или распределенном кэше.

Одним из вариантов является использование распределенного кэша NCache, который обеспечивает возможность совместного использования сессий между различными приложениями. Вы должны указать один и тот же тег Application ID для обоих приложений в настройках состояния сессии, что позволит вам обмениваться объектом сессии, при условии, что у вас сгенерирован одинаковый идентификатор сессии для обоих приложений.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь