2009-09-03 18 views
14

Necesito poder cambiar cuando puedo ver el estado de la sesión. Descubrí la interfaz de marcador IRequiresSessionState, pero no he podido averiguar cómo usarla. Creo que me puede estar perdiendo algo obvio. ¿Puede uno de ustedes, C# guru, darme un paso rápido de 1-2-3 (por ejemplo)?IRequiresSessionState: ¿cómo lo uso?

  1. Crear una nueva clase,
  2. Deja public interface IRequiresSessionState en ella.
  3. Use IRequiresSessionState('abra_cadabra') para cambiar el valor.

Respuesta

11
  1. Para marcar una clase añadir dos puntos para el nombre de clase existente y puso el marcador. Si tuviera una clase: public class PageTools Marcada, se vería como public class PageTools : IRequiresSessionState o con ambas interfaces, public class PageTools : IRequiresSessionState, IHttpHandler. En mi caso, mi clase solo necesitaba ser marcada con la primera. Mi manejador necesitaba ambos.
  2. Si hace clic derecho en el marcador que acaba de escribir, puede elegir implement en el menú (visual studio) y los métodos necesarios se agregarán a su clase. O puede buscarlos y agregarlos manualmente.
  3. Una vez que tenga el marcador IRequiresSessionState, puede realizar una prueba para ver si el estado de la sesión es de solo lectura y, de ser así, establecer un nuevo manejador de http.

    if (context.Handler is IReadOnlySessionState 
        || context.Handler is IRequiresSessionState) 
    { 
        context.Handler = Handler(); 
    } 
    
  4. El manejador http: MSDN le dirá mucho acerca de HttpHandlers y HttpModules. En mi caso, necesitaba un controlador ficticio para poder acceder al estado de la sesión cuando normalmente solo era de lectura (Page_PreInit). Así que en mi clase añadí esto:

    protected IHttpHandler Handler() 
    { 
        MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler 
         as MyHttpHandler; 
        if (resourceHttpHandler != null) // set the original handler back 
        {     
         return resourceHttpHandler.OriginalHandler; 
        } 
        // at this point session state should be available  
        return HttpContext.Current.Handler; 
    } 
    
    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; } 
        } 
    } 
    

Here es una referencia a una clase HttpModule muy elegante de la que me dieron tanto o lo que solía. Espero que esto ayude a alguien.

9

que acaba de obtener su HTTP Handler clase de IRequiresSessionState para obtener acceso SessionState.

public class MyHttpHandler : IHttpHandler, IRequiresSessionState 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     var MyValue = context.Session["MyKey"] as String; 

     MyValue = "Hello World"; 

     context.Session["MyKey"] = MyValue; 
    } 

    public bool IsReusable 
    { 
     get { return true; } 
    } 
} 
+0

¿Puede explicarme cómo utilizaría la clase de controlador HTTP de IRequiresSessionState? – Praesagus

+0

Ding. Timbre. Pasé unas horas tratando de descubrir por qué mi variable de estado de sesión funcionaba en mi ayudante. self.thank = Ton (1). –

2

La interfaz es una interfaz IRequiresSessionState marcador y no contiene métodos, por lo que no se puede utilizar de la manera que está pidiendo en la pregunta. Solo implementa la interfaz en un controlador HTTP para identificar que el controlador requiere acceso de lectura y escritura a los valores del estado de la sesión.

Para ver cómo se implementa en un controlador HTTP, echa un vistazo a este enlace: http://www.willasrari.com/blog/irequiressessionstate-and-dynamic-data-in-static-pages/000262.aspx

Cuestiones relacionadas