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 #)
(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:
Accédez à la session via les discussions HttpContext: -
HttpContext.Current.Session["loginId"]
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.
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 deHttpContext
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.
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
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/
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;