web-dev-qa-db-fra.com

Partage de sessions entre applications à l'aide du service d'état de session ASP.NET

J'essaie de partager des sessions entre deux applications Web, toutes deux hébergées sur le même serveur. L’une est une application de formulaires Web .net 2.0, l’autre est l’application .net 3.5 MVC2.

Les sessions des deux applications sont configurées comme suit: 

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

Dans l'application de formulaire Web, je poste la clé de session dans l'application 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    
}

Je le reçois ensuite dans l'application MVC et essaie d'utiliser la même session comme ceci:

[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"];

}

La clé est en cours d’affichage mais la session ne semble pas être chargée dans l’application MVC, c’est-à-dire que sessionKey est null. Est-ce que ce que j'essaie de faire peut être fait?

47
Dan

Je l'ai fait comme ça:

En gros, l’idée est que les deux applications utilisent l’état de session .net natif stocké dans sqlserver. En utilisant la même clé d'ordinateur et en modifiant légèrement la procédure stockée, les deux applications peuvent partager toutes les clés de session et/ou l'authentification des formulaires.

Les deux applications feraient quelque chose comme ceci dans leur web.config:

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

La base de données d'état de session doit être configurée sur un serveur de base de données, visible par les deux applications.

Docs pour cela: http://msdn.Microsoft.com/en-us/library/ms229862(VS.80).aspx

Commande à exécuter: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin> aspnet_regsql.exe -E -ssadd --sstype p -S.\SQLEXPRESS

Procédure stockée (TempGetAppID) Tweak à:

 @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)
71
Dan

Le problème est que les clés de session sont étendues aux applications. Deux applications ayant la même clé de session ont donc des sessions séparées.

Vous pouvez faire l'une des deux choses suivantes:

  1. Placez les deux applications en tant que répertoire virtuel sous une application IIS commune. Je ne pense pas que ce soit une bonne idée, mais cela fonctionnera.

  2. Rouler votre propre solution de données de session pour les données que vous souhaitez partager. Peut-être en utilisant la base de données principale comme stockage commun, si vous en avez un.

D'après les commentaires de Justin, juste pour clarifier l'option 2 ne fait pas référence à la gestion d'état SQL pour les sessions hors processus. Je veux dire pour vous de gérer manuellement les données partagées pour les deux sessions, éventuellement à l'aide d'une base de données.

9
Chris Taylor

Vous pouvez utiliser une clé d'ordinateur commune pour générer le même identifiant de session dans les deux applications pour un utilisateur donné. En outre, vous devez également planifier le stockage des sessions des deux applications dans un magasin commun tel que le service d'état ASP.NET ou un cache distribué. 

Vous pouvez utiliser le cache distribué NCache qui prend en charge la fonctionnalité de partage de session entre différentes applications. Vous spécifiez la même balise ID d'application pour les deux applications dans les paramètres d'état de session, ce qui vous permet de partager un objet de session à condition que le même ID de session soit généré pour les deux applications.

0
Shoeb Lodhi