88 votes

Puis-je accéder à l'état de la session à partir d'un HTTPModule?

Je pouvais vraiment faire avec la mise à jour d'un utilisateur, les variables de session à partir de l'intérieur de mon HTTPModule, mais de ce que je peux voir, il n'est pas possible.

Mise à JOUR: Mon code est actuellement en cours d'exécution à l'intérieur de l' OnBeginRequest () de gestionnaire d'événements.

Mise à JOUR: Suite à l'avis reçu, à ce jour, j'ai essayé d'ajouter ce point à l' Init () de routine dans mon HTTPModule:

AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute

Mais dans mon OnPreRequestHandlerExecute de la routine, de l'état de session est toujours pas disponible!

Merci, et toutes mes excuses si je suis en manque de quelque chose!

83voto

Jim Harte Points 1338

Trouvé ceci sur les forums ASP.NET :

 using System;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Diagnostics;

// This code demonstrates how to make session state available in HttpModule,
// regradless of requested resource.
// author: Tomasz Jastrzebski

public class MyHttpModule : IHttpModule
{
   public void Init(HttpApplication application)
   {
      application.PostAcquireRequestState += new EventHandler(Application_PostAcquireRequestState);
      application.PostMapRequestHandler += new EventHandler(Application_PostMapRequestHandler);
   }

   void Application_PostMapRequestHandler(object source, EventArgs e)
   {
      HttpApplication app = (HttpApplication)source;

      if (app.Context.Handler is IReadOnlySessionState || app.Context.Handler is IRequiresSessionState) {
         // no need to replace the current handler
         return;
      }

      // swap the current handler
      app.Context.Handler = new MyHttpHandler(app.Context.Handler);
   }

   void Application_PostAcquireRequestState(object source, EventArgs e)
   {
      HttpApplication app = (HttpApplication)source;

      MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler;

      if (resourceHttpHandler != null) {
         // set the original handler back
         HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
      }

      // -> at this point session state should be available

      Debug.Assert(app.Session != null, "it did not work :(");
   }

   public void Dispose()
   {

   }

   // a temp handler used to force the SessionStateModule to load session state
   public class MyHttpHandler : IHttpHandler, IRequiresSessionState
   {
      internal readonly IHttpHandler OriginalHandler;

      public MyHttpHandler(IHttpHandler originalHandler)
      {
         OriginalHandler = originalHandler;
      }

      public void ProcessRequest(HttpContext context)
      {
         // do not worry, ProcessRequest() will not be called, but let's be safe
         throw new InvalidOperationException("MyHttpHandler cannot process requests.");
      }

      public bool IsReusable
      {
         // IsReusable must be set to false since class has a member!
         get { return false; }
      }
   }
}
 

38voto

mdb Points 20629

HttpContext.Actuel.Session devrait fonctionner, en supposant que votre Module HTTP n'est pas de la manipulation de pipeline événements qui se produisent avant l'état de la session en cours d'initialisation...

EDIT, après des précisions dans les commentaires: lors de la manipulation de l' événement BeginRequest, l'objet de Session sera en effet toujours être null/Rien, car elle n'a pas été initialisée par l'ASP.NET runtime encore. Pour contourner ce problème, déplacez votre code de gestion d'un événement qui se produit après PostAcquireRequestState -- j'aime PreRequestHandlerExecute pour moi-même, comme tous les bas-niveau de travail est assez bien fait, à ce stade, mais vous avez encore préjuger des conditions normales de traitement.

15voto

Bert Persyn Points 116

L'accès aux HttpContext.Current.Session dans un IHttpModule peut être fait dans le gestionnaire PreRequestHandlerExecute .

PreRequestHandlerExecute : "Se produit juste avant qu'ASP.NET ne commence à exécuter un gestionnaire d'événements (par exemple, une page ou un service Web XML)." Cela signifie qu'avant l'exécution d'une page 'aspx', cet événement est exécuté. L'état de session est disponible pour que vous puissiez vous assommer.

Exemple:

 public class SessionModule : IHttpModule 
    {
        public void Init(HttpApplication context)
        {
            context.BeginRequest += BeginTransaction;
            context.EndRequest += CommitAndCloseSession;
            context.PreRequestHandlerExecute += PreRequestHandlerExecute;
        }



        public void Dispose() { }

        public void PreRequestHandlerExecute(object sender, EventArgs e)
        {
            var context = ((HttpApplication)sender).Context;
            context.Session["some_sesion"] = new SomeObject();
        }
...
}
 

12voto

Rob Points 766

Si vous êtes à la rédaction d'un normal, basic HttpModule dans une application que vous souhaitez appliquer à asp.net les demandes par le biais de pages ou de gestionnaires, vous avez juste à vous assurer que vous utilisez un événement dans le cycle de vie après la création de session. PreRequestHandlerExecute au lieu de Begin_Request est habituellement l'endroit où je vais. mdb a droit à son édition.

Le long extrait de code initialement classé comme réponse à la question fonctionne, mais c'est compliqué et plus large que la question initiale. Il va traiter le cas lorsque le contenu est à venir à partir de quelque chose qui n'a pas de ASP.net gestionnaire disponibles où vous pouvez mettre en œuvre la IRequiresSessionState interface, déclenchant ainsi le mécanisme de session pour le rendre disponible. (Comme un gif statique fichier sur le disque). En gros, c'est la fixation d'un mannequin gestionnaire, puis il suffit de implémente cette interface pour faire la session disponible.

Si vous voulez juste la session de votre code, il suffit de choisir le droit de l'événement à gérer dans votre module.

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