Андрей прав - это null, потому что при работе в среде ASP.NET MVC HttpContext (и, следовательно, HttpContext.Session) не устанавливается, когда класс контроллера конструируется, как вы могли ожидать, но он устанавливается («внедряется») позже. классом ControllerBuilder. Если вы хотите лучше понять жизненный цикл, вы можете либо вытащить платформу ASP.NET MVC (источник доступен), либо обратиться к этой странице.
Если вам нужно получить доступ к сеансу, то одним из способов было бы переопределить метод «OnActionExecuting» и получить доступ к нему там, так как он будет доступен к тому времени.
Однако, как предлагает Андрей, если ваш код зависит от сеанса, то потенциально может быть сложно писать модульные тесты, поэтому, возможно, вы могли бы подумать о том, чтобы обернуть сеанс во вспомогательный класс, который затем можно заменить на другой, не веб-версия при запуске в модульных тестах, поэтому отключите ваш контроллер от Интернета.
В дополнение к другим ответам здесь, хотя
Controller.Session
он не заполнен в конструкторе, вы все равно можете получить доступ к сеансу через:System.Web.HttpContext.Current.Session
со стандартной оговоркой, что это потенциально снижает тестируемость вашего контроллера.
источник
System.Web.HttpContext.Current.Session
это также естьnull
в инстанциаторе VS2019 MVC.Сессия вводится позже в жизненном цикле. Зачем вообще нужен сеанс в конструкторе? Если вам это нужно для TDD, вы должны обернуть сеанс в имитируемый объект.
источник
Вы можете переопределить метод Initialize, чтобы установить сеанс.
protected override void Initialize(RequestContext requestContext)
источник
Если вы используете контейнер IoC, попробуйте ввести и использовать
HttpSessionStateBase
вместоSession
объекта:private static Container defaultContainer() { return new Container(ioc => { // session manager setup ioc.For<HttpSessionStateBase>() .Use(ctx => new HttpSessionStateWrapper(HttpContext.Current.Session)); }); }
источник
Этот ответ может быть полезен для некоторых людей
Если мы переопределим метод Initialize, мы должны инициализировать базовый класс контекстом запроса: base.Initialize (requestContext);
protected override void Initialize(RequestContext requestContext) { base.Initialize(requestContext); }
источник
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
.