web-dev-qa-db-fra.com

Comment accéder aux variables de session de n'importe quelle classe dans ASP.NET?

J'ai créé un fichier de classe dans le dossier App_Code de mon application. J'ai une variable de session 

Session["loginId"]

Je veux accéder à ces variables de session dans ma classe, mais quand j'écris la ligne suivante, cela donne une erreur

Session["loginId"]

Quelqu'un peut-il me dire comment accéder aux variables de session d'une classe créée dans le dossier app_code dans ASP.NET 2.0 (C #)

149
Prashant

(Mis à jour pour être complet)
Vous pouvez accéder aux variables de session à partir de n’importe quelle page ou contrôle à l’aide de Session["loginId"] et de n’importe quelle classe (par exemple, à l’intérieur d’une bibliothèque de classes), à l’aide de System.Web.HttpContext.Current.Session["loginId"].

Mais s'il vous plaît lisez la suite pour ma réponse originale ...


J'utilise toujours une classe wrapper autour de la session ASP.NET pour simplifier l'accès aux variables de session:

public class MySession
{
    // private constructor
    private MySession()
    {
      Property1 = "default value";
    }

    // Gets the current session.
    public static MySession Current
    {
      get
      {
        MySession session =
          (MySession)HttpContext.Current.Session["__MySession__"];
        if (session == null)
        {
          session = new MySession();
          HttpContext.Current.Session["__MySession__"] = session;
        }
        return session;
      }
    }

    // **** add your session properties here, e.g like this:
    public string Property1 { get; set; }
    public DateTime MyDate { get; set; }
    public int LoginId { get; set; }
}

Cette classe stocke une instance d'elle-même dans la session ASP.NET et vous permet d'accéder aux propriétés de votre session de manière sécurisée au type à partir de n'importe quelle classe, par exemple, comme suit:

int loginId = MySession.Current.LoginId;

string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;

DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;

Cette approche a de nombreux avantages:

  • cela vous évite beaucoup de transtypage
  • vous n'êtes pas obligé d'utiliser des clés de session codées en dur dans votre application (par exemple, Session ["loginId"]
  • vous pouvez documenter vos éléments de session en ajoutant des commentaires XML doc aux propriétés de MySession
  • vous pouvez initialiser vos variables de session avec des valeurs par défaut (par exemple, en s'assurant qu'elles ne sont pas nulles)
347
M4N

Accédez à la session via les discussions HttpContext: -

HttpContext.Current.Session["loginId"]
99
AnthonyWJones

Le problème avec la solution suggérée est qu’elle peut casser certaines fonctionnalités de performance intégrées à SessionState si vous utilisez un stockage de session hors processus. (soit "Mode serveur d'état" ou "Mode serveur SQL"). En mode oop, les données de session doivent être sérialisées à la fin de la demande de page et désérialisées au début de la demande de page, ce qui peut être coûteux. Pour améliorer les performances, SessionState tente uniquement de désérialiser ce qui est nécessaire pour la seule variable de désérialisation lors de son premier accès. Il ne fait que resérialiser et remplacer les variables modifiées. Si vous avez beaucoup de variables de session et que vous les placez dans une classe, l'essentiel de votre session sera désérialisé à chaque requête de page utilisant la session et tout devra être sérialisé à nouveau, même si une seule propriété a été modifiée, car la classe a changé. Juste quelque chose à considérer si vous utilisez beaucoup de session et un mode oop.

22
Ernie

Les réponses présentées avant la mienne apportent des solutions appropriées au problème. Cependant, j'estime qu'il est important de comprendre pourquoi cette erreur résulte:

La propriété Session de Page renvoie une instance de type HttpSessionState relative à cette demande particulière. Page.Session équivaut en fait à appeler Page.Context.Session.

MSDN explique comment cela est possible:

Les pages ASP.NET contenant une référence par défaut à l'espace de noms System.Web (qui contient la classe HttpContext), vous pouvez référencer les membres de HttpContext sur une page .aspx sans la référence de classe pleinement qualifiée à HttpContext.

Toutefois, lorsque vous essayez d'accéder à cette propriété dans une classe dans App_Code, cette propriété ne sera disponible que si votre classe dérive de la classe de page.

Ma solution à ce scénario souvent rencontré est que je ne passe jamais d’objets de page à des classes. Je préfère extraire les objets requis de la page Session et les transmettre à la classe sous la forme d'une collection nom-valeur/Array/List, selon le cas.

12
Cerebrus

J'ai eu la même erreur, car j'essayais de manipuler des variables de session dans une classe Session personnalisée.

Je devais passer le contexte actuel (system.web.httpcontext.current) dans la classe, puis tout s'est bien passé.

MA

1
Munawar Ali

Dans asp.net core, cela fonctionne différemment:

public class SomeOtherClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private ISession _session => _httpContextAccessor.HttpContext.Session;

    public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void TestSet()
    {
        _session.SetString("Test", "Ben Rules!");
    }

    public void TestGet()
    {
        var message = _session.GetString("Test");
    }
}

Source: https://benjii.me/2016/07/using-sessions-and-httpcontext-in-asp-net-and-mvc-core/

0
Matty

Cela devrait être plus efficace à la fois pour l'application et pour le développeur.

Ajoutez la classe suivante à votre projet Web:

/// <summary>
/// This holds all of the session variables for the site.
/// </summary>
public class SessionCentralized
{
protected internal static void Save<T>(string sessionName, T value)
{
    HttpContext.Current.Session[sessionName] = value;
}

protected internal static T Get<T>(string sessionName)
{
    return (T)HttpContext.Current.Session[sessionName];
}

public static int? WhatEverSessionVariableYouWantToHold
{
    get
    {
        return Get<int?>(nameof(WhatEverSessionVariableYouWantToHold));
    }
    set
    {
        Save(nameof(WhatEverSessionVariableYouWantToHold), value);
    }
}

}

Voici l'implémentation:

SessionCentralized.WhatEverSessionVariableYouWantToHold = id;
0
Captain America