2009-09-03 7 views
14

Muszę być w stanie zmienić, gdy widzę stan sesji. Dowiedziałem się o interfejsie znaczników IRequiresSessionState, ale nie byłem w stanie wymyślić, jak z niego korzystać. Myślę, że może mi brakować czegoś oczywistego. Czy któryś z was, C# guru, może dać mi szybki 1-2-3 (np.)?IRequiresSessionState - jak z tego korzystać?

  1. utworzyć nową klasę,
  2. Put public interface IRequiresSessionState w nim.
  3. Aby zmienić wartość, użyj IRequiresSessionState('abra_cadabra').

Odpowiedz

11
  1. Aby oznaczyć klasa dodać dwukropek do istniejącej nazwy klasy i umieścić marker. Gdybym miał klasę: public class PageTools Oznaczona, wyglądałaby na public class PageTools : IRequiresSessionState lub z obydwoma interfejsami, public class PageTools : IRequiresSessionState, IHttpHandler. W moim przypadku moja klasa musiała być oznaczona tylko pierwszą. Mój przewodnik potrzebował obu.
  2. Po kliknięciu markera, który właśnie wpisałeś, możesz wybrać z menu (studio wizualne) implement, a niezbędne metody zostaną dodane do twojej klasy. Lub możesz je wyszukać i dodać ręcznie.
  3. Po uzyskaniu znacznika IRequiresSessionState można przetestować, czy stan sesji jest tylko do odczytu, a jeśli tak, ustawić nowy program obsługi http.

    if (context.Handler is IReadOnlySessionState 
        || context.Handler is IRequiresSessionState) 
    { 
        context.Handler = Handler(); 
    } 
    
  4. Handler http: MSDN powie wiele o HttpHandlers i HttpModules. W moim przypadku potrzebowałem manekina, aby uzyskać dostęp do stanu sesji, gdy był on normalnie tylko do odczytu (Page_PreInit). Więc w mojej klasie dodałem to:

    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 jest odniesieniem do bardzo eleganckiej klasy modułu HttpModule z którego dostałam dużo lub co kiedyś. Mam nadzieję, że to pomoże komuś.

9

Trzeba tylko czerpać swoją HTTP Handler klasę z IRequiresSessionState dostać sessionState dostępu.

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

Czy możesz wyjaśnić, w jaki sposób chciałbym klasy HTTP Handler z IRequiresSessionState? – Praesagus

+0

Ding. Ding. Spędziłem kilka godzin próbując dowiedzieć się, dlaczego moja zmienna stanu sesji działa w moim pomocniku. self.thank = Ton (1). –

2

Interfejs IRequiresSessionState jest interfejsem marker i nie zawiera żadnych metod, więc nie można używać go w sposób prosicie w pytaniu. Implementujesz interfejs tylko w procedurze obsługi HTTP, aby zidentyfikować, że program obsługi wymaga dostępu do odczytu i zapisu do wartości stanu sesji.

Aby zobaczyć, jak zaimplementować go w obsługi HTTP, sprawdź ten link: http://www.willasrari.com/blog/irequiressessionstate-and-dynamic-data-in-static-pages/000262.aspx