Dans mon application Web, je fais quelque chose comme ceci pour lire les variables de session:
if (HttpContext.Current.Session != null && HttpContext.Current.Session["MyVariable"] != null)
{
string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}
Je comprends pourquoi il est important de vérifier pourquoi HttpContext.Current.Session ["MyVariable"] est nul (la variable n'a peut-être pas encore été stockée dans la session ou la session a été réinitialisée pour diverses raisons), mais pourquoi dois-je vérifier si HttpContext.Current.Session
est nul?
Je crois comprendre que la session est créée automatiquement par ASP.NET, par conséquent HttpContext.Current.Session ne doit jamais être nul. Cette hypothèse est-elle correcte? S'il peut être nul, cela signifie-t-il que je devrais également le vérifier avant d'y stocker quelque chose:
if (HttpContext.Current.Session != null)
{
HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
// What should be done in this case (if session is null)?
// Is it possible to force the session to be created if it doesn't exist?
}
Réponses:
Oui, l'objet Session peut être nul, mais uniquement dans certaines circonstances, que vous ne rencontrerez que rarement:
Si vous n'avez que du code dans les pages, vous ne rencontrerez pas cela. La plupart de mon code ASP .NET utilise Session sans vérifier la valeur null à plusieurs reprises. Il faut cependant penser à cela si vous développez un IHttpModule ou si vous êtes dans les détails plus granuleux d'ASP .NET.
Éditer
En réponse au commentaire: La disponibilité ou non de l'état de session dépend de l'exécution ou non de l'événement AcquireRequestState pour la demande. C'est là que le module d'état de session fait son travail en lisant le cookie de session et en trouvant l'ensemble de variables de session approprié pour vous.
AcquireRequestState s'exécute avant que le contrôle ne soit transféré à votre page. Donc, si vous appelez d'autres fonctionnalités, y compris des classes statiques, à partir de votre page, tout devrait bien se passer.
Si certaines classes effectuent une logique d'initialisation au démarrage, par exemple sur l'événement Application_Start ou à l'aide d'un constructeur statique, l'état de session peut ne pas être disponible. Tout se résume à savoir s'il existe une demande en cours et que AcquireRequestState a été exécuté.
De plus, si le client a désactivé les cookies, l'objet Session sera toujours disponible - mais à la demande suivante, l'utilisateur reviendra avec une nouvelle Session vide. Cela est dû au fait que le client reçoit un Statebag Session s'il n'en a pas déjà un. Si le client ne transporte pas le cookie de session, nous n'avons aucun moyen d'identifier le client comme étant le même, de sorte qu'il se verra remettre une nouvelle session encore et encore.
la source
HttpContext.Current.Session
peut être nul pour coder dans `Application_AcquireRequestState '. Cependant, la requête de la page elle-même rend l'objet de session disponible pour y coder. C'est au moins sous MVC.NET 4.L'affirmation suivante n'est pas entièrement exacte:
J'appelle une méthode statique qui fait référence à la session via HttpContext.Current.Session et elle est nulle. Cependant, j'appelle la méthode via une méthode de service Web via ajax en utilisant jQuery.
Comme je l'ai découvert ici, vous pouvez résoudre le problème avec un simple attribut sur la méthode ou utiliser l'objet de session de service Web:
Merci à Matthew Cozier pour la solution.
Je pensais juste ajouter mes deux cents.
Ed
la source
the default value is false
. Fonctionne comme un charme.Si votre instance Session est nulle et que vous êtes dans un fichier 'ashx', implémentez simplement l'interface 'IRequiresSessionState'.
Cette interface n'a aucun membre, il vous suffit donc d'ajouter le nom de l'interface après la déclaration de classe (C #):
la source
Articles techniques ASP.NET
ÉDITER:
Session: un concept pour les débutants
la source
Dans mon cas, a
ASP.NET State Service
été arrêté. La modificationStartup type
deAutomatic
et le démarrage manuel du service pour la première fois a résolu le problème.la source