Андрей прав - это нулевое значение, потому что при работе в рамках структуры ASP.NET MVC HttpContext (и, следовательно, HttpContext.Session) не задан, когда класс контроллера выполнен так, как вы могли ожидать, но он установил (" впрыскивается ") позже классом ControllerBuilder. Если вы хотите лучше понять жизненный цикл, вы можете либо вытащить структуру ASP.NET MVC (источник доступен), либо обратиться к: this page
Если вам нужно получить доступ к сеансу, то одним из способов было бы переопределить метод «OnActionExecuting» и получить к нему доступ, так как он будет доступен к этому времени.
Однако, как указывает Андрей, если ваш код зависит от сеанса, тогда потенциально может быть трудно написать модульные тесты, поэтому, возможно, вы можете рассмотреть возможность переноса сеанса в вспомогательный класс, который затем может быть заменен на другой, не-веб-версии при работе в модульных тестах, поэтому отключает ваш контроллер от сети.
Я не уверен, что это правильное утверждение о HttpContext. Он фактически построен прямо в начале всего потока. Вы можете немного прочитать подробный поток здесь: http://www.beletsky.net/2011/06/inside-aspnet-mvc-route-to-mvchanlder.html , или вы можете использовать отражатель и найти себя при создании httpContext - вокруг строки 1556 в httpruntime.cs. –
@AlexeyShcherbak Он может быть сконструирован уже - OP о том, было ли установлено в свойстве Session контроллера MVC. то есть публичный сеанс HttpSessionStateBase {get; } в System.Web.Mvc.Controller Это разные вещи. – MemeDeveloper