Frage

ich wirklich mit der Aktualisierung von einer Benutzersitzung Variablen aus meinem Httpmodule tun könnte, aber von dem, was ich sehen kann, ist es nicht möglich.

UPDATE:. Mein Code wird derzeit innerhalb der OnBeginRequest () Event-Handler ausgeführt

UPDATE: Beratung Nach bisher erhalten, habe ich versucht, diese zu der Init () Routine in meinem Httpmodule:

AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute

Aber in meiner OnPreRequestHandlerExecute Routine, der Sitzungsstatus ist noch nicht verfügbar!

Danke und Entschuldigungen, wenn ich etwas fehlt!

War es hilfreich?

Lösung

Sie haben diese über auf der ASP.NET Foren :

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; }
      }
   }
}

Andere Tipps

HttpContext.Current.Session sollten Arbeit einfach, vorausgesetzt, Ihr HTTP-Modul ist der Umgang keine Pipeline Ereignisse dass tritt vor dem Sitzungszustand initialisiert wird ...

EDIT, nach Klärung in den Kommentaren: beim Umgang mit dem Beginrequest Ereignis , wird das Session-Objekt in der Tat immer noch null / Nichts sein, da es nicht von der ASP.NET-Laufzeit noch initialisiert wurde. Um dies zu umgehen, verschieben Sie Ihren Behandlungscode auf ein Ereignis, das nach dem PreRequestHandlerExecute für diese selbst, wie all Low-Level-Arbeit ziemlich viel in diesem Stadium durchgeführt wird, aber immer noch jede normale Verarbeitung vorgreift.

Zugriff auf die HttpContext.Current.Session in einem IHttpModule in den PreRequestHandlerExecute Handler erfolgen.

PreRequestHandlerExecute : "Tritt unmittelbar vor dem ASP.NET startet einen Event-Handler ausgeführt wird (zum Beispiel eine Seite oder ein XML-Web-Service)" Das bedeutet, dass vor einer ‚aspx‘ Seite serviert wird dieses Ereignis ausgeführt wird. Der ‚Sitzungsstatus‘ ist verfügbar, so dass Sie selbst ausknocken können.

Beispiel:

public class SessionModule : IHttpModule 
    {
        public void Init(HttpApplication context)
        {
            context.BeginRequest += BeginTransaction;
            context.EndRequest += CommitAndCloseSession;
            context.PreRequestHandlerExecute += PreRequestHandlerExecute;
        }



        public void Dispose() { }

        public void PreRequestHandlerExecute(object sender, EventArgs e)
        {
            var context = ((HttpApplication)sender).Context;
            context.Session["some_sesion"] = new SomeObject();
        }
...
}

Wenn Sie eine normale, einfache Httpmodule in einer verwalteten Anwendung zu schreiben, die Sie asp.net-Anfragen durch die Seiten oder Handler anwenden möchten, müssen Sie nur sicherstellen, dass Sie ein Ereignis im Lebenszyklus nach Sitzung Erstellung verwenden . PreRequestHandlerExecute statt Begin_Request ist in der Regel, wo ich gehe. mdb hat es richtig in seinem bearbeiten.

Je länger Code-Schnipsel ursprünglich als Beantwortung der Frage Werke aufgeführt, ist aber kompliziert und breiter als die erste Frage. Es wird den Fall behandeln, wenn der Inhalt von etwas kommt, das nicht ein ASP.net-Handler zur Verfügung hat, wo Sie den IRequiresSessionState Schnittstelle implementieren können, wodurch die Sitzung Triggermechanismus zu Verfügung zu stellen. (Wie eine statische GIF-Datei auf der Festplatte). Es ist im Grunde einen Dummy-Handler einstellen, die dann implementiert gerade diese Schnittstelle der Sitzung zur Verfügung zu stellen.

Wenn Sie nur die Sitzung für Ihren Code wollen, genau die richtige Veranstaltung holt in Ihrem Modul zu behandeln.

Versuchen Sie es: in der Klasse MyHttpModule declare:

private HttpApplication contextapp;

Dann:

public void Init(HttpApplication application)
{
     //Must be after AcquireRequestState - the session exist after RequestState
     application.PostAcquireRequestState += new EventHandler(MyNewEvent);
     this.contextapp=application;
}  

Und so, in einem anderen Verfahren (das Ereignis) in der gleichen Klasse:

public void MyNewEvent(object sender, EventArgs e)
{
    //A example...
    if(contextoapp.Context.Session != null)
    {
       this.contextapp.Context.Session.Timeout=30;
       System.Diagnostics.Debug.WriteLine("Timeout changed");
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top