Andrei a raison - il est nul car lors de l'exécution sous le framework ASP.NET MVC, HttpContext (et donc HttpContext.Session) n'est pas défini lorsque la classe de contrôleur est construite comme vous pouvez vous y attendre, mais il est défini ("injecté") plus tard par la classe ControllerBuilder. Si vous voulez une meilleure compréhension du cycle de vie, vous pouvez soit dérouler le framework ASP.NET MVC (la source est disponible), soit vous référer à: cette page
Si vous avez besoin d'accéder à la session, une façon serait de remplacer la méthode "OnActionExecuting" et d'y accéder, car elle sera disponible à ce moment-là.
Cependant, comme le suggère Andrei, si votre code dépend de la session, il pourrait être difficile d'écrire des tests unitaires, vous pourriez peut-être envisager d'encapsuler la session dans une classe d'assistance qui peut ensuite être échangée contre une autre, non- version web lors de l'exécution sous tests unitaires, donc découpler votre contrôleur du web.
En plus des autres réponses ici, bien qu'il
Controller.Session
ne soit pas renseigné dans le constructeur, vous pouvez toujours accéder à la session via:System.Web.HttpContext.Current.Session
avec l'avertissement standard que cela réduit potentiellement la testabilité de votre contrôleur.
la source
La session est injectée plus tard dans le cycle de vie. Pourquoi avez-vous besoin de la session dans le constructeur de toute façon? Si vous en avez besoin pour TDD, vous devez envelopper la session dans un objet moquable.
la source
Vous pouvez remplacer la méthode Initialize pour définir votre session.
la source
Si vous utilisez un conteneur IoC, essayez d'injecter et d'utiliser le
HttpSessionStateBase
au lieu de l'Session
objet:la source
Cette réponse peut être utile pour certaines personnes
Si nous surchargons la méthode Initialize, nous devons initialiser la classe de base avec le contexte de requête: base.Initialize (requestContext);
la source
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
.