2009-07-09 14 views
51

Tengo un HttpHandler que se ejecuta en una página de cliente (dominio cruzado, no en nuestro servidor IIS, etc.) y cuando hacen clic en nuestro enlace incrustado, se desactiva el controlador en nuestro servidor. Hasta ahora todo funciona normalmente.¿Cómo se usa el estado de sesión ASP.NET en un HttpHandler?

Ahora estoy tratando de usar el objeto System.Web.HttpContext.Session pero es nulo. ¿Estoy pensando que es nulo porque no tenemos una sesión hasta que se invoque nuestro HttpHandler? ¿Y múltiples llamadas al manejador crearán una nueva sesión por llamada? Si este es el caso, ¿la MS acaba de deshabilitar el objeto Session al llamar a un HttpHandler? ¿Alguien puede confirmar esto?

Si este es el caso, ¿qué haces para mantener el estado entre llamadas? ¿Algún tipo de objeto de datos basado en SQL? ¿Un archivo?

TIA

Respuesta

124

Que su HttpHandler aplicar la IRequiresSessionState interfaz. Permitirá el uso del estado de la sesión. IRequiresSessionState se puede encontrar en el espacio de nombres System.Web.SessionState.

+1

@ Michael no habría constituido en el pensamiento de que, en un millón de años gracias :) –

+0

Ejecución trabajado para mí: Public Class BasicHandler Implementa IHttpHandler Implementa IRequiresSessionState –

24

yo creo que hay que implementar la interfaz vacío IReadOnlySessionState, por lo que será cargado el contexto.

de edición para añadir:

Según la respuesta de Michael Morton, también puede implementarIRequiresSessionState, que dará acceso de escritura también al objeto Session

+2

Para muchos HttpHandler utiliza IReadOnlySessionState es mejor, por lo menos cuando sólo se está comprobando el estado de sesión no guardarlo, pero la razón principal de esto es la mejor la respuesta se debe a que HttpHandler implementa IReadOnlySessionState o IRequiresSessionState en lugar de heredar (las clases solo pueden heredar de otras clases). – JackArbiter

-10

intente utilizar el contexto actual ...

System.Web.HttpContext.Current.Session 
+0

no funciona, a menos que implementa una de las dos interfaces de marcador –

+1

La sesión será nula sin IRequiresSessionState/IReadOnlySessionState – Colin

+1

Mi mal ... estaba pensando en HttpModules. –

2
using System; 
using System.Web; 
using System.Web.SessionState; 
public class DownloadHandler : IHttpHandler, IReadOnlySessionState 
{ 
    public bool IsReusable { get { return true; } } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Write(context.Session["kmx"]); 
    } 
} 
Cuestiones relacionadas