Realmente podría actualizar las variables de sesión de un usuario desde mi HTTPModule, pero por lo que puedo ver, no es posible.
ACTUALIZACIÓN: Mi código se está ejecutando actualmente dentro del OnBeginRequest ()
controlador de eventos.
ACTUALIZACIÓN: Siguiendo los consejos recibidos hasta ahora, intenté agregar esto a la Init ()
rutina en mi HTTPModule:
AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute
¡Pero en mi OnPreRequestHandlerExecute
rutina, el estado de la sesión aún no está disponible!
Gracias y disculpas si me falta algo.
asp.net
session-state
httpmodule
Chris Roberts
fuente
fuente
HttpContext.Current.Session debería funcionar, asumiendo que su módulo HTTP no está manejando ningún evento de canalización que ocurra antes de que se inicialice el estado de la sesión ...
EDITAR, después de una aclaración en los comentarios: al manejar el evento BeginRequest , el objeto Session seguirá siendo nulo / Nada, ya que aún no ha sido inicializado por el tiempo de ejecución de ASP.NET. Para solucionar esto, mueva su código de manejo a un evento que ocurra después de PostAcquireRequestState ; me gusta PreRequestHandlerExecute para eso yo mismo, ya que todo el trabajo de bajo nivel está prácticamente hecho en esta etapa, pero aún se adelanta a cualquier procesamiento normal.
fuente
El acceso a
HttpContext.Current.Session
en aIHttpModule
se puede hacer en elPreRequestHandlerExecute
controlador.PreRequestHandlerExecute : "Ocurre justo antes de que ASP.NET comience a ejecutar un controlador de eventos (por ejemplo, una página o un servicio Web XML)". Esto significa que antes de que se sirva una página 'aspx', este evento se ejecuta. El 'estado de sesión' está disponible para que pueda dejarse inconsciente.
Ejemplo:
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(); } ... }
fuente
Si está escribiendo un HttpModule normal y básico en una aplicación administrada que desea aplicar a las solicitudes de asp.net a través de páginas o controladores, solo debe asegurarse de que está utilizando un evento en el ciclo de vida después de la creación de la sesión. PreRequestHandlerExecute en lugar de Begin_Request es normalmente donde voy. mdb lo tiene bien en su edición.
El fragmento de código más largo que se enumeró originalmente como respuesta a la pregunta funciona, pero es complicado y más amplio que la pregunta inicial. Manejará el caso cuando el contenido provenga de algo que no tiene un controlador ASP.net disponible donde puede implementar la interfaz IRequiresSessionState, activando así el mecanismo de sesión para que esté disponible. (Como un archivo gif estático en disco). Básicamente se trata de configurar un controlador ficticio que luego simplemente implementa esa interfaz para que la sesión esté disponible.
Si solo desea la sesión para su código, simplemente elija el evento correcto para manejar en su módulo.
fuente
Pruébelo: en la clase MyHttpModule declare:
private HttpApplication contextapp;
Entonces:
public void Init(HttpApplication application) { //Must be after AcquireRequestState - the session exist after RequestState application.PostAcquireRequestState += new EventHandler(MyNewEvent); this.contextapp=application; }
Y así, en otro método (el evento) en la misma clase:
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"); } }
fuente