130 votes

ASP.net que faire si la session actuelle est nulle ?

Dans mon application web, je fais quelque chose de ce genre 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.Actuel.Session["Mavariable"] est null (la variable n'aurait pas été stocké dans la Session ou la Session a été remis à zéro pour diverses raisons) mais pourquoi ai-je besoin de vérifier si HttpContext.Actuel.La Session est nulle?

Ma compréhension est que la session est créé automatiquement par asp.net donc HttpContext.Actuel.Session doit jamais être null. Cette hypothèse est correcte? Si elle peut être nulle, ça veut dire que je devrais aussi vérifier avant de la 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?
}

163voto

driis Points 70872

Oui, l'objet de Session peut être null, mais seulement dans certaines circonstances, vous n'rarement à afficher dans:

Si vous n'avez code dans les pages, vous ne rencontrerez pas de cela. La plupart de mes ASP .NET code utilise la Session sans vérifier la valeur null à plusieurs reprises. Il est, cependant, quelque chose à penser si vous êtes l'élaboration d'un IHttpModule ou autre est dans le graveleux détails de l'ASP .NET.

Modifier

En réponse à l'observation: Si oui ou non l'état de session est disponible dépend de la AcquireRequestState événement a fait la demande. C'est là l'état de la session module-t-il son travail par la lecture du cookie de session et de trouver la appropiate ensemble de variables de session pour vous.

AcquireRequestState s'exécute avant que le contrôle est remis à votre Page. Donc, si vous appelez d'autres fonctionnalités, y compris les classes statiques, à partir de votre page, vous devriez être bien.

Si vous avez quelques classes en faisant une logique d'initialisation lors du démarrage, par exemple sur l'événement Application_Start ou à l'aide d'un constructeur statique, l'état de Session peuvent ne pas être disponibles. Tout se résume à savoir si il y a une demande en cours et AcquireRequestState a été exécuté.

Aussi, si le client a désactivé les cookies, l'objet de Session seront encore disponibles mais lors de la prochaine requête, l'utilisateur sera de retour avec une nouvelle Session vide. C'est parce que le client a une Session statebag si il ne possède pas déjà un. Si le client ne possède pas de transport, le cookie de session, nous n'avons aucun moyen d'identifier le client lors de la même, de sorte qu'il sera remis une nouvelle session, encore et encore.

40voto

Ed Bishop Points 380

L'instruction suivante n'est pas tout à fait exacte:

"Donc, si vous appelez d'autres fonctionnalités, y compris les classes statiques, à partir de votre page, vous devriez être bien"

Je suis de l'appel d'une méthode statique qui fait référence à la session par l'intermédiaire de HttpContext.Actuel.Session et il est nul. Cependant, je suis l'appel de la méthode via un webservice méthode par ajax à l'aide de jQuery.

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

Il y a un truc bien, afin d'accéder à l'état de session dans une méthode web, vous devez activer la gestion d'état de session comme ceci:

[WebMethod(EnableSession = true)]

En spécifiant le EnableSession valeur, vous avez désormais un réussi session de jouer avec. Si vous ne spécifiez pas cette valeur, vous obtiendrez une Session null objet, et plus que probablement exécuter en référence null exceptions tout en essayant d'accéder à l'objet de session.

Merci à Matthieu plus confortable pour la solution.

Juste pensé que je voudrais ajouter mon grain de sel.

Ed

25voto

mathijsuitmegen Points 809

Si votre instance de Session a la valeur null et votre un fichier « ashx », simplement implémenter l’interface « IRequiresSessionState ».

Cette interface n’a pas tous les membres ainsi vous suffit d’ajouter le nom d’interface après la déclaration de classe (c#) :

2voto

AVD Points 57984

ASP.NET Articles Techniques

RÉSUMÉ: Dans ASP.NET chaque page Web dérive du Système.Web.L'INTERFACE utilisateur.Page classe. La classe de la Page d'agrégats d'une instance de l'objet HttpSession pour les données de session. La classe de la Page expose les différents événements et les méthodes pour la personnalisation. En particulier, l' Méthode OnInit est utilisé pour définir la initialiser l'état de l'objet Page. Si la demande n'a pas la Cookie de Session, un nouveau cookie de Session sera délivré au demandeur.

EDIT:

Session: Un Concept pour les Débutants

RÉSUMÉ: Session est créé lorsque l'utilisateur envoie une première demande au serveur pour n'importe quelle page de l'application web, l'application crée la Session et envoie l'ID de Session de retour à l' l'utilisateur de la réponse et est stocké dans la machine cliente comme une petite cookie. Donc, idéalement, la "machine qui a désactivé les cookies de session les informations ne seront pas stockées".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X