web-dev-qa-db-fra.com

Que dois-je faire si la session ASP.NET en cours est nulle?

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 null (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?

Si j'ai bien compris, la session est créée automatiquement par ASP.NET. Par conséquent, HttpContext.Current.Session ne doit jamais être null. 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?
}
118
Anthony

Oui, l'objet Session peut être nul, mais seulement dans certaines circonstances que vous rencontrerez rarement:

Si vous avez seulement du code dans les pages, vous ne rencontrerez pas cela. La plupart de mes ASP. Code .NET utilisent Session sans rechercher le caractère null à plusieurs reprises. Cependant, vous devez penser à quelque chose si vous développez un IHttpModule ou si vous êtes dans les détails plus précis de ASP .NET.

Modifier

En réponse au commentaire: La disponibilité ou non de l'état de la session dépend du fait que l'événement AcquireRequestState s'est exécuté ou non pour la demande. C’est ici que le module d’état de session fait son travail en lisant le cookie de session et en recherchant le jeu de variables de session approprié.

AcquireRequestState s'exécute avant que le contrôle ne soit passé à 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 exécutent la logique d'initialisation au démarrage, par exemple lors de 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 si 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. En effet, le client reçoit un état de session s'il n'en possède pas déjà un. Si le client ne transporte pas le cookie de session, nous n'avons aucun moyen de l'identifier comme identique, de sorte qu'il se verra attribuer une nouvelle session encore et encore.

152
driis

L'énoncé suivant n'est pas tout à fait exact:

"Donc, si vous appelez d'autres fonctionnalités, y compris des classes statiques, à partir de votre page, tout devrait bien se passer"

J'appelle une méthode statique qui référence la session via HttpContext.Current.Session et elle est null. Cependant, j'appelle la méthode via une méthode de service Web via ajax à l'aide de jQuery.

Comme je l'ai découvert ici vous pouvez résoudre le problème avec un attribut simple sur la méthode ou utiliser l'objet de session de service Web:

Toutefois, pour accéder à l’état de la session au sein d’une méthode Web, vous devez activer la gestion de l’état de la session comme suit:

[WebMethod (EnableSession = true)]

En spécifiant la valeur EnableSession, vous aurez maintenant une session gérée avec laquelle vous pourrez jouer. Si vous ne spécifiez pas cette valeur, vous obtiendrez un objet Session nul et probablement des exceptions de référence null lors de la tentative d'accès à l'objet de session.

Merci à Matthew Cozier pour la solution.

Je pensais juste ajouter mes deux sous.

Ed

39
Ed Bishop

Si votre instance de 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 la classe (C #):

public class MyAshxClass : IHttpHandler, IRequiresSessionState
18
mathijsuitmegen

Articles techniques ASP.NET

Résumé: Dans ASP.NET, chaque page Web provient de la classe System.Web.UI.Page. La classe Page regroupe une instance de l'objet HttpSession pour les données de session. La classe Page expose différents événements et méthodes de personnalisation. En particulier, la méthode OnInit est utilisée pour définir l'état d'initialisation de l'objet Page. Si la demande ne contient pas de cookie de session, un nouveau cookie de session sera envoyé au demandeur.

MODIFIER:

Session: Un concept pour les débutants

Résumé: La session est créée lorsque l'utilisateur envoie une première demande au serveur pour une page de l'application Web. L'application crée la session et renvoie l'ID de session à l'utilisateur avec la réponse. Il est stocké dans la machine cliente sous la forme d'un petit cookie. . Donc, idéalement, "l'ordinateur qui a désactivé les cookies, les informations de session ne seront pas stockées".

2
adatapost