Если вы хотите поделиться сессиями между различными приложениями, вам нужно сделать несколько вещей.
Сначала вам нужно запустить состояние сеанса в режиме SQL.
В этот момент я обнаружил, что состояние сеанса SQL использует ключ компьютера и ваш _appDomainAppId, чтобы сгенерировать ключ для вашего приложения для доступа к его собственным данным сеанса. Таким образом, мы должны сохранить их одинаковыми для всех ваших приложений.
В веб-конфигах ваших приложений вам нужно использовать один и тот же ключ компьютера. Это может быть любое место внутри тега system.web E.G:
<machineKey decryptionKey="EDCDA6DF458176504BBCC720A4E29348E252E652591179E2" validationKey="CC482ED6B5D3569819B3C8F07AC3FA855B2FED7F0130F55D8405597C796457A2F5162D35C69B61F257DB5EFE6BC4F6CEBDD23A4118C4519F55185CB5EB3DFE61"/>
Добавьте appSetting «ApplicationName» и дайте ему имя (оно должно быть одинаковым для обоих приложений)
Затем вам нужно будет создать модуль общего сеанса, который изменит _appDomainAppId. Ниже приводится то, что я использую.
namespace YourApp
{
using System.Configuration;
using System.Reflection;
using System.Web;
/// <summary>class used for sharing the session between app domains</summary>
public class SharedSessionModule : IHttpModule
{
#region IHttpModule Members
/// <summary>
/// Initializes a module and prepares it to handle requests.
/// </summary>
/// <param name="context">An <see cref="T:System.Web.HttpApplication"/>
/// that provides access to the methods,
/// properties, and events common to all application objects within an ASP.NET
/// application</param>
/// <created date="5/31/2008" by="Peter Femiani"/>
public void Init(HttpApplication context)
{
// Get the app name from config file...
string appName = ConfigurationManager.AppSettings["ApplicationName"];
if (!string.IsNullOrEmpty(appName))
{
FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic);
HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);
FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", BindingFlags.Instance | BindingFlags.NonPublic);
appNameInfo.SetValue(theRuntime, appName);
}
}
/// <summary>
/// Disposes of the resources (other than memory) used by the module that
/// implements <see cref="T:System.Web.IHttpModule"/>.
/// </summary>
/// <created date="5/31/2008" by="Peter Femiani"/>
public void Dispose()
{
}
#endregion
}
}
В веб-конфигурации вам нужно добавить этот модуль:
<add name="SharedSessionModule" type="YourApp.SharedSessionModule, YourApp, Version=1.0.0.0, Culture=neutral" />
Последнее, что нужно сделать, это разрешить файлу сеанса проходить между доменами ... вот так
var session = HttpContext.Current.Session;
var request = HttpContext.Current.Request;
var cookie = request.Cookies["ASP.NET_SessionId"];
if (cookie != null && session != null && session.SessionID != null)
{
cookie.Value = session.SessionID;
cookie.Domain = "yourappdomain.com";
// the full stop prefix denotes all sub domains
cookie.Path = "/"; // default session cookie path root
}
И это должно сработать.