53 votes

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

Je suis en train de partager les sessions entre deux applications web hébergées sur le même serveur. L'un est un .net 2.0: le web des formulaires de demande de l'autre est .net 3.5 MVC2 application.

Les deux applications ont leur session configurer comme ceci:

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

Dans le formulaire de demande je vous poste la de la clé de session à 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    
}

J'ai ensuite recevoir dans le MVC de l'application et essayez 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"];

}

L'essentiel est d'être posté, mais la séance ne semble pas être chargés dans l'application MVC, c'est à dire sessionKey est null. Ce que je suis en train de faire faire?

76voto

Dan Points 12178

J'ai fait de cette façon:

Fondamentalement, l'idée est à la fois utiliser les applications natives .net sessionState stockées dans sql server. En utilisant la même clé de l'ordinateur et de faire un petit tweak pour une procédure stockée – les deux applications peuvent partager toutes les clés de session et/ou de formes authenication.

Les deux applications en ferait quelque chose comme cela dans il web.config:

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

L'état de Session db devrait être mis en place sur un serveur de base de données, que les deux applications peuvent voir.

Docs pour ce faire: http://msdn.microsoft.com/en-us/library/ms229862(SV.80).aspx

Commande qui devra être exécuté: 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) réglage:

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

enter image description here

10voto

Chris Taylor Points 25865

Le problème est que les clés de session sont limités à des applications, de sorte que deux applications ayant la même clé de session, en fait, avoir des sessions séparées.

Vous pouvez faire une des deux choses.

1 - Mettre les deux applications comme un répertoire virtuel sous une seule Application IIS. Je ne pense pas que ce soit une bonne idée, mais il faudra travailler.

2 - lancer votre propre session de solution de données pour les données que vous souhaitez partager. Peut-être en utilisant le backend de base de données que la mémoire commune, si vous en avez un qui est.

Basé sur Justin commentaire, juste pour clarifier l'option 2 ne se rapporte pas à l'état SQL managemet de processus de sessions. Je veux dire pour vous de réellement gérer manuellement les données partagées pour les deux séances, éventuellement à l'aide d'une base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X