Je pourrais vraiment faire avec la mise à jour des variables de session d'un utilisateur à partir de mon HTTPModule, mais d'après ce que je peux voir, ce n'est pas possible.
MISE À JOUR: Mon code s'exécute actuellement dans le OnBeginRequest ()
gestionnaire d'événements.
MISE À JOUR: Suite aux conseils reçus jusqu'à présent, j'ai essayé d'ajouter ceci à la Init ()
routine dans mon HTTPModule:
AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute
Mais dans ma OnPreRequestHandlerExecute
routine, l'état de la session est toujours indisponible!
Merci et excuses si je manque quelque chose!
asp.net
session-state
httpmodule
Chris Roberts
la source
la source
HttpContext.Current.Session devrait simplement fonctionner, en supposant que votre module HTTP ne gère aucun événement de pipeline qui se produit avant l'initialisation de l'état de session ...
EDIT, après clarification dans les commentaires: lors de la gestion de l' événement BeginRequest , l'objet Session sera en effet toujours null / Nothing, car il n'a pas encore été initialisé par le runtime ASP.NET. Pour contourner ce problème , déplacez votre code de gestion vers un événement qui se produit après PostAcquireRequestState - j'aime PreRequestHandlerExecute pour cela moi-même, car tout le travail de bas niveau est pratiquement terminé à ce stade, mais vous anticipez toujours tout traitement normal.
la source
L'accès à
HttpContext.Current.Session
dans aIHttpModule
peut être effectué dans lePreRequestHandlerExecute
gestionnaire.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 qu'une page 'aspx' ne soit diffusée, 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(); } ... }
la source
Si vous écrivez un HttpModule de base normal dans une application gérée que vous souhaitez appliquer aux requêtes asp.net via des pages ou des gestionnaires, vous devez simplement vous assurer que vous utilisez un événement dans le cycle de vie après la création de la session. PreRequestHandlerExecute au lieu de Begin_Request est généralement l'endroit où je vais. mdb l'a bien dans son édition.
L'extrait de code plus long répertorié à l'origine comme répondant à la question fonctionne, mais il est compliqué et plus large que la question initiale. Il gérera le cas où le contenu provient de quelque chose qui n'a pas de gestionnaire ASP.net disponible où vous pouvez implémenter l'interface IRequiresSessionState, déclenchant ainsi le mécanisme de session pour le rendre disponible. (Comme un fichier gif statique sur le disque). Il s'agit essentiellement de définir un gestionnaire factice qui implémente simplement cette interface pour rendre la session disponible.
Si vous voulez juste la session pour votre code, choisissez simplement le bon événement à gérer dans votre module.
la source
Essayez-le: dans la classe MyHttpModule déclarez:
private HttpApplication contextapp;
Ensuite:
public void Init(HttpApplication application) { //Must be after AcquireRequestState - the session exist after RequestState application.PostAcquireRequestState += new EventHandler(MyNewEvent); this.contextapp=application; }
Et donc, dans une autre méthode (l'événement) dans la même classe:
public void MyNewEvent(object sender, EventArgs e) { //A example... if(contextoapp.Context.Session != null) { this.contextapp.Context.Session.Timeout=30; System.Diagnostics.Debug.WriteLine("Timeout changed"); } }
la source