2010-05-19 2 views
43

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

Оба приложения имеют свои сессии настроить так:

<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. Могу ли я пытаться сделать это?

+0

Можете ли вы опубликовать код для отправки идентификатора сеанса другому приложению – kk1076

+0

https://blogs.msdn.microsoft.com/toddca/2007/01/25/sharing-asp-net-session-state-across-applications/ – sotn

+0

Ссылка в комментарии @sotn (https://blogs.msdn.microsoft.com/toddca/2007/01/25/sharing-asp-net-session-state-across-applications/) показывает, как вызвать сеанс SQL провайдер, чтобы вернуть один и тот же идентификатор приложения для всех приложений, чтобы они могли совместно использовать один и тот же сеанс. – AgapwIesu

ответ

68

Я сделал это так:

В основном идея заключается оба приложения используют нативную .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" 
/> 

Session состояние БД необходимо будет настроить на сервере базы данных, что оба приложения могут увидеть.

Docs для делать это: 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 р -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) 
+1

Для хранимой процедуры (если вам не понадобится более масштабируемое решение), вы можете просто скопировать имя приложения: 'SET @appName = LOWER (« MyAppNameHere »)' –

+1

Жизнь не такая совершенная. Это решение имеет некоторую ошибку. Я начал использовать его и заметил, что устаревшие строки сеанса не удаляются из db. Поэтому он чрезвычайно растет, и я получаю исключение. «Журнал транзакций для базы данных« ASPState »заполнен». через некоторое время. Как я могу это исправить? – RredCat

+0

Кроме того ASPState_log.LDF занимает ~ 50GB 8 | – RredCat

9

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

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

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

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

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

+0

Я собирался предложить использовать базу данных для решения управления сеансами. Его очень легко настроить, но вы можете столкнуться с одной и той же проблемой. В разных приложениях разные ключи и не могут делиться данными. – Justin

+0

@ Justin, я не предполагаю, что OP использует сеанс ASP.NET в SQL Server. Это, безусловно, будет иметь ту же проблему, ключи сеанса в ASP.NET привязаны к Приложению, независимо от сохранения. Я имею в виду, что OP должен полностью управлять хранением общих данных «вручную» и использовать только механизм сеанса ASP.NET для конкретных данных сеанса приложения, если это необходимо. –

+0

@ Да, дело в том, что вы смешиваете два приложения в одну область. Теперь вы не только обмениваетесь данными сеанса, но и загружаете оба приложения в один и тот же appdomain, где статические данные, переменные приложения, переменная кэша все потенциально влияют друг на друга, просто потому, что вы хотите поделиться данными сеанса. –

0

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

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

Смежные вопросы