41 votes

Définir une variable de session dans Application_BeginRequest

Je suis à l'aide d'ASP MVC et j'ai besoin de définir une variable de session à Application_BeginRequest. Le problème est qu'à ce point de l'objet HttpContext.Current.Session toujours null. Un peu d'aide serait appréciée:

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

Merci à l'avance.

72voto

abcdefghi Points 2149

Essayez AcquireRequestState Mondiale.asax. La Session est disponible dans cet événement qui se déclenche pour chaque demande:

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

Valamas - Les Modifications Suggérées:

Utilisé cela avec MVC 3 avec succès et évite l'erreur de session.

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

14voto

Loudenvier Points 2390

Vous pourriez peut-être changer de paradigme... peut-être vous pouvez utiliser une autre propriété de la classe HttpContext, plus précisément HttpContext.Actuel.Les éléments comme indiqué ci-dessous:

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

Ne pas stocker dans la session, mais il sera stocké sur les Articles du dictionnaire de la classe HttpContext et sera disponible pour la durée de cette demande spécifique. Puisque vous êtes à chaque demande, il faudrait vraiment faire plus de sens de la stocker dans une "session" dictionnaire qui, soit dit en passant, c'est exactement ce que les Articles est tout au sujet. :-)

Désolé pour essayer de déduire de vos besoins au lieu de répondre directement à votre question, mais j'ai été confronté à ce même problème avant et remarqué que ce que je n'a pas besoin de la Session à tous, mais les Éléments de propriété à la place.

4voto

David Fawzy Points 11

Vous pouvez utiliser la session d'éléments dans Application_BeginRequest de cette façon:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X