2009-09-03 5 views
14

Ich muss in der Lage sein zu ändern, wenn ich den Sitzungsstatus sehen kann. Ich habe von der Marker-Schnittstelle IRequiresSessionState erfahren, bin aber nicht in der Lage gewesen, herauszufinden, wie man sie benutzt. Ich denke, dass ich etwas Offensichtliches vermisse. Kann einer von euch C# Gurus mir einen schnellen 1-2-3 Schritt (z. B.) geben?IRequiresSessionState - wie verwende ich es?

  1. Erstellen Sie eine neue Klasse,
  2. public interface IRequiresSessionState in sie.
  3. Verwenden Sie IRequiresSessionState('abra_cadabra'), um den Wert zu ändern.

Antwort

11
  1. Um einen Doppelpunkt zu den bestehenden Klassennamen eine Klasse hinzufügen, markieren und die Markierung setzen. Wenn ich eine Klasse hätte: public class PageTools Markiert, würde es wie public class PageTools : IRequiresSessionState aussehen oder mit beiden Schnittstellen, public class PageTools : IRequiresSessionState, IHttpHandler. In meinem Fall musste meine Klasse nur mit der ersten markiert werden. Mein Handler brauchte beides.
  2. Wenn Sie mit der rechten Maustaste auf den Marker klicken, den Sie gerade eingegeben haben, können Sie implement aus dem Menü (Visual Studio) auswählen und die erforderlichen Methoden werden zu Ihrer Klasse hinzugefügt. Oder Sie können sie nachschlagen und manuell hinzufügen.
  3. Sobald Sie den IRequiresSessionState-Marker haben, können Sie testen, ob der Sitzungsstatus readonly ist, und wenn ja, einen neuen http-Handler einstellen.

    if (context.Handler is IReadOnlySessionState 
        || context.Handler is IRequiresSessionState) 
    { 
        context.Handler = Handler(); 
    } 
    
  4. Der http-Handler: MSDN wird Ihnen sagen, viel über Httphandlers und Httpmodules. In meinem Fall brauchte ich einen Dummy-Handler, so dass ich auf den Sitzungszustand zugreifen konnte, wenn er normalerweise nur gelesen wurde(). Also in meiner Klasse habe ich dies:

    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 ist ein Verweis auf eine sehr elegante Httpmodule Klasse, von der ich habe viel oder was habe ich. Ich hoffe, das hilft jemandem.

9

Sie müssen nur Ihre HTTP Handler Klasse von IRequiresSessionState abzuleiten Session Zugang zu bekommen.

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

Können Sie erklären, wie ich von IRequiresSessionState HTTP-Handler-Klasse würde? – Praesagus

+0

Ding. Ding. Habe ein paar Stunden damit verbracht herauszufinden, warum meine Sitzungsstatusvariable in meinem Helfer funktioniert hat. self.thank = Ton (1). –

2

Die IRequiresSessionState Schnittstelle ist eine Markierungsschnittstelle und enthält keine Methoden, so dass Sie es nicht verwenden, um die Art und Weise Sie in der Frage stellen. Sie implementieren die Schnittstelle nur in einem HTTP-Handler, um zu erkennen, dass der Handler Lese- und Schreibzugriff auf Sitzungsstatuswerte benötigt.

Um zu sehen, wie Sie es in einem HTTP-Handler implementieren, auf diesen Link finden Sie unter: http://www.willasrari.com/blog/irequiressessionstate-and-dynamic-data-in-static-pages/000262.aspx