web-dev-qa-db-fra.com

Définir la variable de session dans Application_BeginRequest

J'utilise ASP.NET MVC et je dois définir une variable de session sur Application_BeginRequest. Le problème est qu'à ce stade, l'objet HttpContext.Current.Session est toujours null.

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());
    }
}
37
Daniel Peñalba

Essayez AcquireRequestState dans Global.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 - Modification suggérée:

Utilisé avec succès avec MVC 3 et évite les erreurs de session.

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

Peut-être pourriez-vous changer le paradigme ... Vous pouvez peut-être utiliser une autre propriété de la classe HttpContext, plus précisément HttpContext.Current.Items comme indiqué ci-dessous:

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

Il ne le stockera pas sur la session, mais il sera stocké dans le dictionnaire Items de la classe HttpContext et sera disponible pour la durée de cette demande spécifique. Puisque vous le définissez à chaque demande, il serait vraiment plus logique de le stocker dans un dictionnaire "par session" qui, incidemment, est exactement ce que les éléments sont tout au sujet. :-)

Désolé d'essayer de déduire vos exigences au lieu de répondre directement à votre question, mais j'ai déjà rencontré ce même problème et j'ai remarqué que ce dont j'avais besoin n'était pas du tout la session, mais plutôt la propriété Items.

12
Loudenvier

Vous pouvez utiliser les éléments de session 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"];
        }
    }
4
David Fawzy