(Mis à jour pour être complet)
Vous pouvez accéder aux variables de session depuis n'importe quelle page ou contrôle en utilisant Session["loginId"]
et depuis n'importe quelle classe (par exemple depuis l'intérieur d'une bibliothèque de classes), en utilisantSystem.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 à vos propriétés de session de manière sécurisée à partir de n'importe quelle classe, par exemple comme ceci:
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 casting
- vous n'avez pas à utiliser des clés de session codées en dur dans toute votre application (par exemple Session ["loginId"]
- vous pouvez documenter vos éléments de session en ajoutant des commentaires de doc XML sur les propriétés de MySession
- vous pouvez initialiser vos variables de session avec des valeurs par défaut (par exemple en vous assurant qu'elles ne sont pas nulles)
Accédez à la session via les threads HttpContext: -
la source
Le problème avec la solution suggérée est qu'elle peut interrompre certaines fonctionnalités de performances 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 de désérialiser uniquement ce qui est nécessaire en désérialisant uniquement la variable lors de son premier accès, et il ne re-sérialise et remplace que la variable qui a été modifiée. Si vous avez beaucoup de variables de session et que vous les mettez toutes dans une classe, pratiquement tout dans votre session sera désérialisé sur chaque requête de page qui utilise session et tout devra être sérialisé à nouveau même si une seule propriété a été modifiée en raison de la modification de la classe. Juste quelque chose à considérer si vous utilisez beaucoup de session et un mode oop.
la source
Les réponses présentées avant la mienne fournissent des solutions appropriées au problème, cependant, je pense qu'il est important de comprendre pourquoi cette erreur se produit:
La
Session
propriété dePage
renvoie une instance de typeHttpSessionState
relative à cette requête particulière.Page.Session
équivaut en fait à appelerPage.Context.Session
.MSDN explique comment cela est possible:
Toutefois, lorsque vous essayez d'accéder à cette propriété dans une classe dans App_Code, la propriété ne vous sera pas disponible à moins que votre classe ne dérive de la classe de page.
Ma solution à ce scénario souvent rencontré est que je ne transmets jamais d'objets de page aux classes . Je préférerais 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.
la source
J'ai eu la même erreur, car j'essayais de manipuler des variables de session dans une classe Session personnalisée.
J'ai dû passer le contexte actuel (system.web.httpcontext.current) dans la classe, puis tout s'est bien passé.
MA
la source
Dans le noyau asp.net, cela fonctionne différemment:
Source: https://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/
la source
Cela devrait être plus efficace tant pour l'application que pour le développeur.
Ajoutez la classe suivante à votre projet Web:
Voici la mise en œuvre:
la source