Andrei hat Recht - es ist null, da bei Ausführung unter dem ASP.NET MVC-Framework der HttpContext (und damit HttpContext.Session) nicht festgelegt wird, wenn die Controller-Klasse wie erwartet erstellt wird, sondern später festgelegt ("injiziert") von der ControllerBuilder-Klasse. Wenn Sie den Lebenszyklus besser verstehen möchten, können Sie entweder das ASP.NET MVC-Framework herunterladen (die Quelle ist verfügbar) oder auf folgende Seite verweisen
Wenn Sie auf die Sitzung zugreifen müssen, besteht eine Möglichkeit darin, die Methode "OnActionExecuting" zu überschreiben und dort darauf zuzugreifen, da sie zu diesem Zeitpunkt verfügbar sein wird.
Wie Andrei jedoch vorschlägt, kann es möglicherweise schwierig sein, Komponententests zu schreiben, wenn Ihr Code von der Sitzung abhängt. Vielleicht können Sie die Sitzung in eine Hilfsklasse einbinden, die dann gegen eine andere, nicht austauschende Klasse ausgetauscht werden kann Web-Version, wenn Sie unter Unit-Tests ausgeführt werden. Koppeln Sie daher Ihren Controller vom Web.
Zusätzlich zu den anderen Antworten hier
Controller.Session
können Sie auf die Sitzung zugreifen , obwohl sie nicht im Konstruktor angegeben ist:System.Web.HttpContext.Current.Session
mit der üblichen Einschränkung, dass dies möglicherweise die Testbarkeit Ihres Controllers verringert.
quelle
Die Sitzung wird später im Lebenszyklus injiziert. Warum brauchen Sie die Sitzung überhaupt im Konstruktor? Wenn Sie es für TDD benötigen, sollten Sie die Sitzung in ein verspottbares Objekt einschließen.
quelle
Sie können die Initialisierungsmethode überschreiben, um Ihre Sitzung festzulegen.
quelle
Wenn Sie einen IoC-Container verwenden, versuchen Sie,
HttpSessionStateBase
anstelle desSession
Objekts Folgendes zu injizieren und zu verwenden :quelle
Diese Antwort könnte für manche Menschen nützlich sein
Wenn wir die Initialize-Methode überschreiben, müssen wir die Basisklasse mit dem Anforderungskontext initialisieren: base.Initialize (requestContext);
quelle
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
.