2009-12-16 5 views
1

Sur ma page Web de connexion (la première page que l'utilisateur frappe) J'ai le code de cette forme:Quand une session est-elle créée?

public class MyPage : System.Web.UI.Page { 
    private MyClass _obj = new MyClass(); 
    ... 

MyClass a le constructeur:

public MyClass() { 
    var sess = HttpContext.Current.Session; // no problem here 
    sess["MyValue"] = 123; // throws null ref exception coz sess is null 
} 

Comme je l'ai commenté, l'appel à sess["MyValue"] renvoie une exception de référence null, car HttpContext n'a pas encore créé l'objet de session.

Alors, quand est-il sécuritaire d'accéder à l'objet Session? Je ne veux pas abandonner la déclaration/initialisation en ligne de _obj; C'est très pratique pour moi! Quelles alternatives ai-je?

Répondre

13

Vous devriez être en mesure d'accéder à la session dans ou après l'événement OnInit de la page, ou PreInit si vous êtes si dérangé. Avant cela, et vous êtes en train de mourir avec la mort.

+1

+1 pour l'info et le LOL :) –

1

Vous pouvez regarder le pipeline http. Rich Starhl a un nice article.. Vos objets de session sont créés/récupérés pendant l'événement aquireRequestState. Si vous avez des modules HTTP qui interceptent la requête avant cet événement, votre session n'a peut-être pas été initialisée

2

Si l'utilisateur est sur la première page du site, la session ne contient aucun objet. Vous devriez certainement vérifier la valeur avant de l'assigner.

if (Session["MyValue"] == null) 
    Session.Add("MyValue", ""); 

Session["MyValue"] = "123"; 

Vous pouvez également ajouter le fichier Global.asax au projet. C'est là que vous pouvez gérer l'événement Session_Start.

1

La session est créée en aquireRequestState événement du pipeline de modules Http. J'ai essayé d'expliquer tout ce détail ci-dessous en détail.

Nous avons ci-dessous événements pipeline Http Module:
(Pre - Page du cycle de vie)
1. BeginRequest
2. AuthenticateRequest
3. AuthorizeRequest
4. ResolveRequestCache
5. AcquireRequestState
6. PreRequestHandlerExecute

post - Page du cycle de vie
7. PostRequestHandlerExecute
8. ReleaseRequestState
9. UpdateRequestCache
10. EndRequest

Maintenant, nous sommes conscients, le premier événement dans le cycle de vie de la page est PreInit. Vous essayez de créer l'objet _obj avant PreInit événement. Dans le cycle de vie de la requête, ce processus de création d'objet et d'exécution du constructeur est effectué pendant ResolveRequestCache i.e; avant AcquireRequestState event (puisque ceci est directement créé en classe et pas n'importe quelle méthode).Comme prévu, la session ne sera toujours pas disponible dans le constructeur car AcquireRequestState n'est pas encore exécuté.

méthode PreInit dans le cycle de vie de page est appelée après AcquireRequestState et par conséquent la session y est disponible.

Conclusion: plus tôt les opérations de session peuvent être effectuées à tout moment après AcquireRequestState dans les modules Http (si vous interceptent la demande par programme) ou/après méthode PreInit.

Questions connexes