2009-09-05 10 views
104

Dans mon application web, je peux faire quelque chose comme ça pour lire les variables de session:Que faire si la session ASP.NET actuelle est null?

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 nulle (la variable peut-être pas ont été stockés 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?

Ma compréhension est que la session est créée automatiquement par ASP.NET donc HttpContext.Current.Session ne devrait jamais être nulle. Cette hypothèse est-elle correcte? Si elle peut être nulle, cela signifie que je dois aussi vérifier avant de le ranger quelque chose dans ce:

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? 
} 
+0

ASP.NET WebAPI aura un comportement diferent, vous pouvez le vérifier sur [Accès à la session Utilisation de l'API Web ASP.NET] (http://stackoverflow.com/questions/9594229/accessing-session-using -asp-net-web-api? answertab = votes # tab-top) –

Répondre

135

Oui , l'objet Session peut être nul, mais seulement dans certaines circonstances, u ne fonctionnera que rarement dans:

Si vous avez seulement du code dans les pages, vous ne rencontrerez pas cela. La plupart de mon code ASP .NET utilise Session sans vérifier à plusieurs reprises null. Il est, cependant, quelque chose à penser si vous développez un IHttpModule ou autrement est dans les détails plus abrupts de ASP .NET.

Modifier

En réponse au commentaire: Que session ou pas d'état est disponible dépend si l'événement AcquireRequestState a couru pour la demande. C'est ici que le module d'état de session fonctionne en lisant le cookie de session et en trouvant l'ensemble approprié de variables de session pour vous. AcquireRequestState s'exécute avant que le contrôle ne soit transmis à votre page.

Donc, si vous appelez d'autres fonctionnalités, y compris des classes statiques, à partir de votre page, ça devrait aller.

Si certaines classes exécutent une logique d'initialisation au démarrage, par exemple dans l'événement Application_Start ou en utilisant 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 AcquireRequestState a été exécuté.

De même, si le client a désactivé les cookies, l'objet Session sera toujours disponible - mais à la prochaine demande, l'utilisateur renverra avec une nouvelle session vide. C'est parce que le client reçoit un Statebag de 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, donc il se verra remettre une nouvelle session encore et encore.

+4

Juste une petite mise à jour que j'ai trouvée aujourd'hui. La session n'est pas disponible sur le constructeur de la page! Uniquement sur l'événement Init ou après. –

+0

Je viens de rencontrer un HttpContext.Current.Session == null est le code appelé par un événement Page_Load d'une page maître. Apparemment, cela peut se produire dans le contexte d'une page. Si j'inspecte l'objet HttpContext.Current, la plupart de ses membres sont initialisés, mais CurrentNotification et IsPostNotification génèrent une erreur: {System.PlatformNotSupportedException}. Quelle que soit la cause, ce problème ne s'est pas produit en production, où il a duré des années. La plate-forme est Windows Server 2003 R2 SP2, l'application a la structure cible .Net 3.5 et s'exécute dans IIS avec l'état de session activé. –

+0

J'ai également trouvé que, quand IIS sert une requête directe pour un fichier de ressources qui existe sur le disque, comme une feuille de style, 'HttpContext.Current.Session' peut être nul à coder dans' Application_AcquireRequestState '. La demande pour la page elle-même, cependant, rend l'objet de session disponible pour le code là. C'est sous MVC.NET 4 au moins. –

2

ASP.NET Technical Articles

SUMMARY: In ASP.NET, every Web page derives from the System.Web.UI.Page class. The Page class aggregates an instance of the HttpSession object for session data. The Page class exposes different events and methods for customization. In particular, the OnInit method is used to set the initialize state of the Page object. If the request does not have the Session cookie, a new Session cookie will be issued to the requester.

EDIT:

Session: A Concept for Beginners

SUMMARY: Session is created when user sends a first request to the server for any page in the web application, the application creates the Session and sends the Session ID back to the user with the response and is stored in the client machine as a small cookie. So ideally the "machine that has disabled the cookies, session information will not be stored".

15

Si votre instance de session est null et que vous êtes dans un fichier 'ashx', implémentez simplement l'interface 'IRequiresSessionState'.

Cette interface n'a pas de membres que vous avez juste besoin d'ajouter le nom d'interface après la déclaration de classe (C#):

public class MyAshxClass : IHttpHandler, IRequiresSessionState 
+2

A travaillé pour moi, en utilisant avec le script de téléchargement Uploadify, merci. – Renan

+0

Merci beaucoup, la session était nulle dans ma classe de connexion. Quand j'ai ajouté ce code à mon gestionnaire ashx, cela a également transformé la session sur ma classe –

+0

Je pense que cela répond assez bien à la question. Merci beaucoup. –

38

La déclaration suivante est pas tout à fait exact:

"So if you are calling other functionality, including static classes, from your page, you should be fine"

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 webservice via ajax en utilisant jQuery.

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

There’s a trick though, in order to access the session state within a web method, you must enable the session state management like so:

[WebMethod(EnableSession = true)]

By specifying the EnableSession value, you will now have a managed session to play with. If you don’t specify this value, you will get a null Session object, and more than likely run into null reference exceptions whilst trying to access the session object.

Merci à Matthew Cozier pour la solution.

Je pensais juste ajouter mes deux cents.

Ed

+1

merci Ed, Session apparaissait comme nulle dans le webmethod - en ajoutant cela l'a corrigé. +1 – fusi

+1

Eh bien, quand vous appelez dans un webservice, vous utilisez une autre requête que pour la page, donc cette déclaration est toujours correcte, IMO. – driis

+0

Documents MSDN [ici] (http://msdn.microsoft.com/en-us/library/byxd99hx%28v=vs.90%29.aspx#vbtskusingwebmethodattributeenablesession) - 'la valeur par défaut est false'. Fonctionne comme un charme. – benjineer

Questions connexes