Partager la session entre deux sites Web en utilisant asp.net et le serveur d’état

J’ai deux sites Web identiques hébergés sur deux machines différentes sous IIS 7.5. Le service d’état ASP.NET s’exécute sur ma machine et le fichier web.config est mis à jour sur les deux sites avec le code suivant:

 

La connexion à distance autorisée est définie sur 1 dans la base de registre afin que le deuxième site Web puisse accéder au serveur d’état.

Les deux sites Web ont la même clé d’ordinateur:

  

De plus, les deux sites sont configurés dans IIS pour avoir le même identifiant.

Ce que je veux faire, c’est que ces deux sites partagent les mêmes données de session, par exemple, ils peuvent effectuer les tâches suivantes:

 // At web site 1: Session["key"] = "value" 

et

 // At web site 2: // Read session value from the other web site ssortingng result = Session["key"] 

Le problème est que je ne parviens pas à accomplir ce test et ne peux vraiment pas comprendre ce que je fais mal.

Une idée qui pourrait aider?

Vous aurez besoin d’un moyen de convaincre votre navigateur d’envoyer le même cookie de session ASP.NET, quel que soit le site visité.

Si le cookie n’est pas présent dans la demande, une nouvelle session sera créée avec cette clé.

Je pense que vous pouvez faire en sorte que le navigateur conserve la clé avec certaines configurations sournoises de DNS – si vous affectez http://website1.mydomain.com/ et http://website2.domain.com/ aux adresses de vos sites, définissez le domaine du cookie de session ASP.NET sur “domain.com”, votre navigateur l’enverra aux deux sites et la session devra être partagée.

Vous pourrez également utiliser le mode sans cookie avec ASP.NET et récupérer l’ID de session à partir des URL générées.

Je sais que cette question a reçu une réponse il y a 5 ans et pourtant, aujourd’hui, je pense pouvoir lui donner plus d’informations.

Premièrement, ce n’est pas le moyen officiel de partager des données de session entre 2 applications IIS, ni le moyen le plus populaire. La méthode “apparemment officielle” consiste à utiliser une session SQL Server .

Si vous ne pouvez pas utiliser le serveur SQL pour une raison quelconque, nous pouvons modifier un peu les applications IIS afin d’utiliser la session hors processus, également appelée mode d’état de session StateServer .

Pour que cela fonctionne, il y a pas mal de choses à corriger:

  1. Le cookie de session de 2 applications doit être défini sur le même nom de domaine. Par exemple
  
  1. La clé d’ordinateur doit être appariée. Vous pouvez utiliser le chiffrement de champ Web.config standard pour le rendre plus sécurisé, mais cela est facultatif.
  
  1. Mode d’état de session défini sur le serveur d’état

Rassembler (1), (2), (3) ensemble:

     ... 
  1. Le nom de l’application doit correspondre . Sinon, seul l’ID de session peut être partagé, mais pas les données de session. Le problème est que vous ne pouvez pas configurer le nom de votre application dans Web.config. Pourtant, nous pouvons créer notre propre configuration puis l’injecter par reflection. Il suffit de mettre le code suivant dans Global.asax.cs:

     public override void Init() { base.Init(); try { // Get the app name from config file... ssortingng appName = ConfigurationManager.AppSettings["ApplicationName"]; if (!ssortingng.IsNullOrEmpty(appName)) { foreach (ssortingng moduleName in this.Modules) { IHttpModule module = this.Modules[moduleName]; SessionStateModule ssm = module as SessionStateModule; if (ssm != null) { FieldInfo storeInfo = typeof(SessionStateModule).GetField("_store", BindingFlags.Instance | BindingFlags.NonPublic); SessionStateStoreProviderBase store = (SessionStateStoreProviderBase)storeInfo.GetValue(ssm); if (store == null) //In IIS7 Integrated mode, module.Init() is called later { 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); } else { Type storeType = store.GetType(); if (storeType.Name.Equals("OutOfProcSessionStateStore")) { FieldInfo uribaseInfo = storeType.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic); uribaseInfo.SetValue(storeType, appName); } } } } } } catch (Exception ex) { log.Error(ex.Message, ex); } } 

    Les crédits vont à pfemiani , Li Chen , et à une personne dont je ne me souviens plus qui l’a mis dans le commentaire d’un projet de code. Veuillez noter que la réponse de pfemiani ne fonctionne pas pour moi, mais sa combinaison avec le message de Li Chen le fait.

  2. Assurez-vous que le service d’état ASP .NET est en cours d’exécution. C’est là que les données de session seraient sauvegardées maintenant.

Partage de session entre deux applications Web asp.net

S’il vous plaît se référer ci-dessous URL

http://www.freshcodehub.com/Article/48/sharing-session-between-two-aspnet-web-applications