2009-09-05 17 views
104

Nella mia applicazione web, ho fare qualcosa di simile per leggere le variabili di sessione:Cosa devo fare se la sessione ASP.NET corrente è nullo?

if (HttpContext.Current.Session != null && HttpContext.Current.Session["MyVariable"] != null) 
{ 
    string myVariable= (string)HttpContext.Current.Session["MyVariable"]; 
} 

capisco perché è importante controllare il motivo per cui HttpContext.Current.Session [ "MyVariable"] è nullo (la variabile non potrebbe sono stati memorizzati nella Sessione ancora o la Sessione è stata ripristinata per vari motivi), ma perché devo verificare se HttpContext.Current.Session è nullo?

La mia comprensione è che la sessione viene creata automaticamente da ASP.NET pertanto HttpContext.Current.Session non dovrebbe mai essere nullo. Questa supposizione è corretta? Se può essere nullo, significa che dovrei controllare anche prima di memorizzare qualcosa in esso:

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 avrà un comportamento spettacolo diverso, è possibile controllare su [Accesso sessione utilizzando ASP.NET Web API] (http://stackoverflow.com/questions/9594229/accessing-session-using -asp-net-web-api? answertab = voti # tab-top) –

risposta

135

Sì , l'oggetto Session potrebbe essere nullo, ma solo in determinate circostanze, quale yo u solo raramente eseguito in:

Se si dispone solo di codice nelle pagine, non ci si imbatterà in questo. La maggior parte del mio codice ASP .NET utilizza Session senza verificare ripetutamente null. È, tuttavia, qualcosa a cui pensare se si sta sviluppando un IHttpModule o altrimenti è giù nei dettagli più grintosi di ASP. NET.

Modifica

In risposta al commento: Se o non dello stato della sessione è disponibile dipende dal fatto che l'evento AcquireRequestState ha eseguito per la richiesta. Qui è dove il modulo dello stato della sessione funziona, leggendo il cookie di sessione e trovando l'insieme appropriato di variabili di sessione per te.

AcquireRequestState viene eseguito prima che il controllo venga passato alla tua pagina. Quindi se stai chiamando altre funzionalità, incluse le classi statiche, dalla tua pagina, dovresti stare bene.

Se alcune classi eseguono la logica di inizializzazione durante l'avvio, ad esempio sull'evento Application_Start o utilizzando un costruttore statico, lo stato della sessione potrebbe non essere disponibile. Tutto si riduce al fatto che sia presente una richiesta corrente e che sia stato eseguito AcquireRequestState.

Inoltre, se il client ha disabilitato i cookie, l'oggetto Session sarà ancora disponibile, ma alla richiesta successiva, l'utente ritornerà con una nuova sessione vuota. Questo perché al client viene assegnato un Session Statebag se non ne ha già uno. Se il cliente non trasporta il cookie di sessione, non abbiamo modo di identificare il cliente come lo stesso, quindi gli verrà consegnata una nuova sessione ancora e ancora.

+4

Solo un rapido aggiornamento che ho trovato oggi. Sessione non disponibile sul costruttore di pagine! Solo sull'evento Init o dopo. –

+0

Ho appena incontrato un HttpContext.Current.Session == null è il codice richiamato da un evento Page_Load di una pagina master. Apparentemente, questo _can_ si verifica nel contesto di una pagina. Se ispeziono l'oggetto HttpContext.Current, la maggior parte dei membri sono inizializzati, ma CurrentNotification e IsPostNotification generano un errore: {System.PlatformNotSupportedException}. Qualunque sia la causa, questo problema non si è verificato nella produzione, dove è stato eseguito per anni. La piattaforma è Windows Server 2003 R2 SP2, l'applicazione ha il framework di destinazione .Net 3.5 ed è in esecuzione in IIS con stato di sessione abilitato. –

+0

Ho anche scoperto che, quando IIS sta servendo una richiesta diretta per un file di risorse che esiste su disco, come un foglio di stile, 'HttpContext.Current.Session' può essere nullo per codificare in' Application_AcquireRequestState '. La richiesta per la pagina stessa, tuttavia, rende l'oggetto di sessione disponibile per il codice lì. Questo è sotto MVC.NET 4 almeno. –

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

Se l'istanza Session è nullo e si trova in un file 'ashx', implementare semplicemente l'interfaccia 'IRequiresSessionState'.

Questa interfaccia non ha membri in modo che solo bisogno di aggiungere il nome dell'interfaccia dopo la dichiarazione della classe (C#):

public class MyAshxClass : IHttpHandler, IRequiresSessionState 
+2

Ha funzionato per me, usando con lo script di caricamento di Uploadify, grazie. – Renan

+0

Grazie mille, la sessione era nullo nella mia classe di accesso. Quando ho aggiunto questo codice al mio gestore di ashx, ha trasformato la sessione anche nella mia classe –

+0

Penso che questo risponda abbastanza bene alla domanda. Grazie mille. –

38

La seguente dichiarazione non è del tutto esatto:

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

Sto chiamando un metodo statico che fa riferimento alla sessione tramite HttpContext.Current.Session ed è null. Tuttavia, sto chiamando il metodo tramite un metodo webservice attraverso ajax usando jQuery.

Come ho scoperto here è possibile risolvere il problema con un semplice attributo del metodo, o utilizzare il web sessione di servizio oggetto:

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.

Grazie a Matthew Cozier per la soluzione.

Ho solo pensato di aggiungere i miei due centesimi.

Ed

+1

grazie a Ed, Session appariva come null nel webmethod - aggiungendo questo risolto. +1 – fusi

+1

Bene, quando si chiama in un servizio web, si utilizza un'altra richiesta rispetto alla pagina, quindi l'istruzione è ancora corretta, IMO. – driis

+0

Documenti MSDN [qui] (http://msdn.microsoft.com/en-us/library/byxd99hx%28v=vs.90%29.aspx#vbtskusingwebmethodattributeenablesession) - "il valore predefinito è falso". Funziona come un fascino. – benjineer

Problemi correlati