Si vous souhaitez partager des sessions entre différentes applications, vous devez effectuer certaines opérations.
Vous devez d'abord exécuter l'état de session en mode SQL. À ce stade, j'ai découvert que l'état de la session SQL prend la clé de la machine et votre _appDomainAppId pour générer une clé pour que votre application accède à ses propres données de session. Nous devons donc garder la même chose entre toutes vos applications.
Dans les configurations Web de vos applications, vous devez utiliser la même clé machine. Cela peut être tout où l'intérieur de la system.web balises EG:
<machineKey decryptionKey="EDCDA6DF458176504BBCC720A4E29348E252E652591179E2" validationKey="CC482ED6B5D3569819B3C8F07AC3FA855B2FED7F0130F55D8405597C796457A2F5162D35C69B61F257DB5EFE6BC4F6CEBDD23A4118C4519F55185CB5EB3DFE61"/>
Ajouter un appSetting « ApplicationName » et lui donner le nom (ce qui doit être le même pour les deux applications) Vous devrez ensuite créer un module de session partagé qui va changer le _appDomainAppId. Celui ci-dessous est ce que j'utilise.
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
}
}
Dans la configuration web, vous devez ajouter ce module:
<add name="SharedSessionModule" type="YourApp.SharedSessionModule, YourApp, Version=1.0.0.0, Culture=neutral" />
dernière chose à faire est de permettre le cookie de session pour passer entre les domaines ...comme si
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
}
Et cela devrait faire l'affaire.
Je suis sûr, vous pourriez avoir obtenu la réponse maintenant, mais je veux juste poster le lien à une réponse ici sur SO http://stackoverflow.com/questions/2868316/sharing-sessions-across-applications-using -the-asp-net-session-state-service/3151315 # 3151315 – Vamsi