2011-05-12 35 views
36

estoy usando ASP.NET MVC y yo tenga que configurar una variable de sesión en Application_BeginRequest. El problema es que en este punto el objeto HttpContext.Current.Session es siempre null.Establecer variable de sesión en Application_BeginRequest

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    if (HttpContext.Current.Session != null) 
    { 
     //this code is never executed, current session is always null 
     HttpContext.Current.Session.Add("__MySessionVariable", new object()); 
    } 
} 
+0

Relacionado/especie de duplicado de: http://stackoverflow.com/questions/765054/whens-the-earliest-i-can -access-some-session-data-in-global-asax/ –

Respuesta

64

Trate AcquireRequestState en Global.asax. Sesión está disponible en este evento que dispara para cada solicitud:

void Application_AcquireRequestState(object sender, EventArgs e) 
{ 
    // Session is Available here 
    HttpContext context = HttpContext.Current; 
    context.Session["foo"] = "foo"; 
} 

Valamas - Editar sugerida:

utilizado este con MVC 3 con éxito y evita error de sesión.

protected void Application_AcquireRequestState(object sender, EventArgs e) 
{ 
    HttpContext context = HttpContext.Current; 
    if (context != null && context.Session != null) 
    { 
     context.Session["foo"] = "foo"; 
    } 
} 
+7

Estoy usando MVC 3 y esto no funciona. La sesión es nula. –

+2

Esto es exactamente lo que necesitaba. –

+4

Esto no funciona para mí tampoco es nulo context.Session – JBeckton

11

Tal vez usted podría cambiar el paradigma ... Tal vez se puede utilizar otra propiedad de la clase HttpContext, más específicamente HttpContext.Current.Items como se muestra a continuación:

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    HttpContext.Current.Items["__MySessionVariable"] = new object(); 
} 

No va a almacenar en la sesión, pero se almacenará en el diccionario Elementos de la clase HttpContext y estará disponible durante la duración de esa solicitud específica. Ya que lo está configurando en cada solicitud, realmente tendría más sentido almacenarlo en un diccionario "por sesión" que, dicho sea de paso, es exactamente de lo que tratan los Elementos. :-)

Perdón por tratar de inferir sus requisitos en lugar de responder su pregunta directamente, pero me he enfrentado al mismo problema antes y noté que lo que necesitaba no era la sesión en absoluto, sino la propiedad Items.

4

Puede utilizar los elementos de la sesión en Application_BeginRequest esta manera:

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     //Note everything hardcoded, for simplicity! 
     HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("LanguagePref"); 

     if (cookie == null) 
      return; 
     string language = cookie["LanguagePref"]; 

     if (language.Length<2) 
      return; 
     language = language.Substring(0, 2).ToLower(); 
     HttpContext.Current.Items["__SessionLang"] = language; 
     Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(language); 

    } 

    protected void Application_AcquireRequestState(object sender, EventArgs e) 
    { 
     HttpContext context = HttpContext.Current; 
     if (context != null && context.Session != null) 
     { 
      context.Session["Lang"] = HttpContext.Current.Items["__SessionLang"]; 
     } 
    } 
Cuestiones relacionadas