Accueil > .Net, Développement > Partage de sessions : Gestion native des sessions en .Net

Partage de sessions : Gestion native des sessions en .Net

Ce billet fait partie de la série « Partage de sessions » :

  1. Présentation
  2. Gestion native des sessions en .Net (ce billet)
  3. Focus, State Server
  4. Focus, SQL Server
  5. Focus, Couchbase
  6. Autres possibilités
  7. Conclusion
  8. Annexes

Dans ce billet, nous allons voir les différentes possibilités qu’offrent directement le Framework .Net.
Ce billet sera relativement court, car il sera décomposé dans les différents focus suivants.

 

Généralités

 

De base, il y a quatre manières de gérer la session en .Net.
Une présentation assez complète est disponible ici : Exploring Session in ASP.NET.

Le schéma (souvent reprit) suivant est assez explicite, quant aux possibilités de base :
ASP.Net - Session Collection

Par défaut, c’est le mode InProc qui est utilisé.
Une autre possibilité est bien sûr de désactiver totalement l’usage de la session.

De plus, une Foire Aux Questions est disponible : Understanding session state modes + FAQ.
Un billet de blog détaille également d’autres considérations à prendre en compte : ASP.NET Session State: Architectural and Performance Considerations.

Pour une application basique, le mode InProc (In-Process) va amplement suffire.
S’il y a besoin d’un Load Balancing, il existe des mécanismes prévus pour conserver un utilisateur sur la machine de sa première connexion (ce concept se nomme de plusieurs manière : « session affinity », « sticky sessions » ou « sticky connections »).

Les autres modes sont dis « Out-of-Process » car ils ne sont pas gérer dans le même processus (de IIS).
Par contre, il faut bien prendre en compte que ces modes là devront sérialiser les objets, ce qui peut entraîner un surcoût non négligeables, en fonction des objets.
Et, bien évidemment, il faut que les objets soient sérialisables… Le plus souvent, c’est une sérialisation binaire.

Le mode State Server est le plus simple à mettre en place, avec le moins d’actions.
Le mode SQL Server est le plus utile dans les cas d’applicatifs hybrides (comprendre que tous ne sont pas codés en .Net).
Et enfin, le mode « Custom » sera pour tous les autres providers (Couchbase, MongoDB, RavenDB, etc., nous en verrons quelques uns par la suite).

Dans les cas « State Server » et « SQL Server », il faut bien veiller à ce que tous les serveurs de la ferme (Load Balancing) aient les mêmes paramètres concernant les « machinekey », exemple :

    <machineKey validationKey="6D5DE1528F719A039EF93C23594137B73A0280818CC941BB5038CCE6770654FDF1A8340514B2A03331702D3FC7D9B396F965BCFCBA22A108FC4B27E4038FE6A8"
      decryptionKey="A26503B3437076AF51D82E283F5FE2D75AD7DC63FFAA2599"
      validation="SHA1"
    />

(voir les annexes pour savoir comment gérer les valeurs de cet ensemble)

Enfin, comme l’événement « Session_End » du Global.asax n’est levé qu’avec le mode InProc, il convient de gérer différemment l’expiration de session, exemple :

protected void Page_Init(object sender, EventArgs e)
{
    if (Context.Session != null)
    {
        if (Session.IsNewSession)
        {
            HttpCookie newSessionIdCookie =
                Request.Cookies["ASP.NET_SessionId"];
            if (newSessionIdCookie != null)
            {
                string newSessionIdCookieValue = newSessionIdCookie.Value;
                if (newSessionIdCookieValue != string.Empty)
                {
                    // La session a expirée, une nouvelle a été créée
                }
            }
        }
    }
}

 

InProc

 

Le comportement InProc est celui par défaut, celui qui est donc, à priori, le mieux connu.
Je ne vais donc pas m’étendre là-dessus.

Ce qu’il faut surtout retenir, c’est que le InProc (In Process) est géré dans le processus de ISS, ce qui veut dire que si le pool d’application, ou même l’application est redémarrée, la session sera définitivement perdue.

Les avantages sont la facilité d’utilisation (rien de plus à faire, c’est le comportement par défaut), l’accès est rapide, la sérialisation des données n’est pas requise.
Les inconvénients portent majoritairement sur la taille des données : plus il y en a, plus les performances générales de l’application vont se dégrader. Donc, mettre des objets volumineux tout en ayant beaucoup d’utilisateurs est une très mauvaise idée. Enfin, une ferme de serveurs sera plus complexe à gérer avec l’InProc.

A utiliser pour les applications ayant une utilisation relativement légère sans trop stocker en session, donc.
Si pour un site personnel, cela est largement suffisant, pour un site grand public avec beaucoup de trafic, il faut envisager un autre scénario.

 

Custom

 

ASP.Net - Session - Custom

Pour implémenter une gestion personnalisée de la session, il faut créer une classe héritant de « SessionStateStoreProviderBase ». Accessoirement, il est également possible d’hériter de l’interface « ISessionIDManager » pour gérer l’identifiant de session.

Il faut ensuite le déclarer dans le fichier de configuration.

    <sessionState
      mode="Custom"
      customProvider="SessionProvider">
      <providers>
        <add name="SessionProvider" type="SessionProvider"/>
      </providers>
    </sessionState>

L’avantage, c’est que cette méthode permet un contrôle total de la session. Elle n’est pas non plus liée à IIS et donc n’est pas susceptible de perdre des informations en cas de reboot du serveur web (ou de IIS ou du pool d’application).

Si on prend une solution clef en main (comme Couchbase ou d’autres possibilités), il faut faire confiance aux développeurs. Ou relire le code si c’est Open Source (l’expérience me dis que c’est pas fais, mais bon, passons). Si on refait tout…eh bien il y a toujours moyen de réinventer une roue carrée.

Catégories :.Net, Développement

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :