2012-03-27 10 views
9

Ich versuche, den Sitzungsstatus in meinem global.asax für jede Anforderung (Seite, Dokumente, PDF usw.) zuzugreifen. Ich weiß, dass ich das nicht in Application_BeginRequest tun kann, und ich dachte, ich könnte in Application_AcquireRequestState, aber es wird nicht funktionieren, was seltsam ist, weil es in einem anderen Projekt funktioniert.Global.asax-Ereignis, das Zugriff auf Sitzungsstatus hat

Also, ich bin auf der Suche nach einem Ereignis, in dem ich immer Zugriff auf den Sitzungsstatus für jede Anfrage haben würde.

Dank

EDIT: @ Mike

Ich habe versucht, diese

Sub Application_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs) 
    Session("test") = "test" 
End Sub 

tun Aber ich immer noch Fehler auftreten, wie ich Zugriff auf Sitzungszustand nicht haben.

Antwort

15

Die Sitzung wird während Application_AcquireRequestState geladen. Ihre sichere Wette ist, Application_PreRequestHandlerExecute zu bauen und dort darauf zuzugreifen.


Update: Nicht jede Anfrage hat einen Sitzungsstatus. Sie müssen auch nach Null suchen: if (System.Web.HttpContext.Current.Session != null).

7

Die ursprüngliche Request wird keine Session gebunden haben. Daher müssen Sie, wenn Session überprüfen ist nicht null:

var session = HttpContext.Current.Session; 

if(session != null) { 
    /* ... do stuff ... */ 
} 
+0

Es scheint zu funktionieren, aber wenn ich finden kann etwas Besseres, es wäre schön. Danke – Shadowxvii

+2

Danke für den Hinweis zur ersten Sitzung! – Stumblor

0
If HttpContext.Current IsNot Nothing AndAlso HttpContext.Current.Session IsNot Nothing Then 
strError = HttpContext.Current.Session("trCustomerEmail") 
End If 
0

Basierend auf den input von Mike, hier ist ein Ausschnitt mit meinem Arbeits Code in Global.asax:

namespace WebApplication 
{ 
    public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      /* ... */ 
     } 

     protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e) 
     { 
      if (HttpContext.Current.Session != null && HttpContext.Current.Session["isLogged"] != null && (bool)HttpContext.Current.Session["isLogged"]) 
      { 
       HttpContext.Current.User = (LoginModel)HttpContext.Current.Session["LoginModel"]; 
      } 
     } 
    } 
} 

Und in der Steuerung:

namespace WebApplication.Controllers 
{ 
    [Authorize] 
    public class AccountController : Controller 
    { 
     /* ... */ 

     [HttpPost] 
     [AllowAnonymous] 
     [ValidateAntiForgeryToken] 
     public async Task<ActionResult> Login(LoginModel model, string returnUrl) 
     { 
      if (!ModelState.IsValid) 
      { 
       return View(model); 
      } 

      // Don't do this in production! 
      if (model.Username == "me") { 
       this.Session["isLogged"] = true; 
       this.Session["LoginModel"] = model; 
      } 
     } 
    } 
} 
Verwandte Themen