2012-04-18 19 views

Antwort

3

Hier ist ein Beispiel für die Verwendung Sitzung innerhalb Httpmodule, gefunden here:

using System; 
using System.Web; 
using System.Web.Security; 
using System.Web.SessionState; 
using System.Diagnostics; 

// This code demonstrates how to make session state available in HttpModule, 
// regradless of requested resource. 
// author: Tomasz Jastrzebski 

public class MyHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication application) 
    { 
     application.PostAcquireRequestState += new EventHandler(Application_PostAcquireRequestState); 
     application.PostMapRequestHandler += new EventHandler(Application_PostMapRequestHandler); 
    } 

    void Application_PostMapRequestHandler(object source, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)source; 

     if (app.Context.Handler is IReadOnlySessionState || app.Context.Handler is IRequiresSessionState) { 
     // no need to replace the current handler 
     return; 
     } 

     // swap the current handler 
     app.Context.Handler = new MyHttpHandler(app.Context.Handler); 
    } 

    void Application_PostAcquireRequestState(object source, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)source; 

     MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler; 

     if (resourceHttpHandler != null) { 
     // set the original handler back 
     HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler; 
     } 

     // -> at this point session state should be available 

     Debug.Assert(app.Session != null, "it did not work :("); 
    } 

    public void Dispose() 
    { 

    } 

    // a temp handler used to force the SessionStateModule to load session state 
    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; } 
     } 
    } 
} 
+0

'OriginalHandler.ProcessRequest (Kontext);' in 'ProcessRequest', wenn Ihr Code ** eigentlich nicht ** nennen' Process () ' – TheGeekZn

+0

Wer weiß, ob diese noch gültig ist? Ich bekomme Fehler in der debug.assert sagen, dass die Sitzung in diesem Kontext nicht verfügbar ist. – Martin

3

ich schlage vor, einen weniger invasiven Ansatz. Erzwingen Sie die ASP.NET-Laufzeit, um die Sitzung für Ihr Modul mit SetSessionStateBehavior() bereitzustellen (Implementierungen von IRequiresSessionState werden nur für IHttpHandlers berücksichtigt).

public void Init(HttpApplication httpApp) 
{ 
    //SESSION WILL BE AVAILABLE IN ALL EVENTS FROM PreRequestHandlerExecute TO PostRequestHandlerExecute 
    httpApp.PostRequestHandlerExecute += OnPostRequestHandlerExecute; 
    //THIS IS THE IMPORTANT LINE 
    httpApp.Context.SetSessionStateBehavior(SessionStateBehavior.ReadOnly); 
} 
Verwandte Themen