Подтвердить что ты не робот

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

Я пытаюсь обмениваться сеансами между двумя веб-приложениями, размещенными на одном сервере. Один из них - это приложение .net 2.0 для веб-форм, другое - как .net 3.5 MVC2.

Оба приложения имеют свой сеанс, настроенный следующим образом:

<sessionState
      mode="StateServer"
      stateConnectionString="tcpip=127.0.0.1:42424"
      />

В приложении webform я отправляю ключ сеанса в приложение MVC:

protected void LinkButton1_Click(object sender, EventArgs e)
{
    Session["myvariable"] = "dan"; 
    string sessionKey = HttpContext.Current.Session.SessionID;

    //Followed by some code that posts sessionKey to the other application    
}

Затем я получаю его в приложении MVC и попробую использовать тот же сеанс, как это:

[HttpPost]
public  void Recieve(string sessionKey )
{
    var manager = new SessionIDManager();

    bool redirected;
    bool IsAdded;

     manager.SaveSessionID(HttpContext.ApplicationInstance.Context, Id, out redirected, out IsAdded);
     var myVar = Session["myvariable"];

}

Ключ отправляется, но сеанс, похоже, не загружается в приложение MVC, т.е. sessionKey имеет значение NULL. Могу ли я пытаться сделать это?

4b9b3361

Ответ 1

Я сделал это следующим образом:

В основном идея заключается в том, что оба приложения используют собственный .net sessionState, хранящийся в sqlserver. Используя тот же машинный ключ и делая небольшую настройку для хранимой процедуры - оба приложения могут совместно использовать любые ключи сеанса и/или аутентификацию форм.

Оба приложения будут делать что-то подобное в своем web.config:

<sessionState mode="SQLServer" sqlConnectionString="Data Source=.\SQLEXPRESS;User Id=test;Password=test;Application Name=AppName"  />
    <machineKey
validationKey="SOMEKEY"
validation="SHA1" decryption="AES"
/>

Состояние сеанса db должно быть настроено на сервере базы данных, которое могут видеть оба приложения.

Документы для этого: http://msdn.microsoft.com/en-us/library/ms229862(VS.80).aspx

Команда, которая должна быть запущена: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin > aspnet_regsql.exe -E -ssadd --sstype p -S.\SQLEXPRESS

Сохраненная процедура (TempGetAppID) настраивается на:

 @appId int OUTPUT
AS

    -- start change

    -- Use the application name specified in the connection for the appname if specified
    -- This allows us to share session between sites just by making sure they have the
    -- the same application name in the connection string.
    DECLARE @connStrAppName nvarchar(50)
    SET @connStrAppName = APP_NAME()

    -- .NET SQLClient Data Provider is the default application name for .NET apps
    IF (@connStrAppName <> '.NET SQLClient Data Provider')
        SET @appName = @connStrAppName

    -- end change

SET @appName = LOWER(@appName)

Ответ 2

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

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

  • Поместите оба приложения в качестве виртуального каталога под общим приложением IIS. Я не думаю, что это хорошая идея, но она будет работать.

  • Сбросьте свое собственное решение для передачи данных для данных, которые вы хотите предоставить. Возможно, используя базовую базу данных как общее хранилище, если у вас есть тот, который есть.

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

Ответ 3

Вы можете использовать общий ключ Machine для создания того же идентификатора сеанса в обоих приложениях для данного пользователя. Кроме того, вы также должны планировать сохранение сеансов обоих приложений в общем хранилище, таком как государственная служба ASP.NET или распределенный кеш.

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