Andrei está certo - é nulo porque quando executado sob a estrutura ASP.NET MVC, o HttpContext (e, portanto, HttpContext.Session) não é definido quando a classe do controlador é construída como você poderia esperar, mas é definido ("injetado") mais tarde pela classe ControllerBuilder. Se você quiser um melhor entendimento do ciclo de vida, você pode puxar para baixo o framework ASP.NET MVC (o código-fonte está disponível) ou consultar: esta página
Se você precisar acessar a Sessão, uma forma seria sobrescrever o método "OnActionExecuting" e acessá-lo lá, pois ele estará disponível nessa hora.
No entanto, como Andrei está sugerindo, se seu código é dependente da Sessão, então pode ser potencialmente difícil escrever testes de unidade, então talvez você possa considerar envolver a Sessão em uma classe auxiliar que pode ser trocada por uma classe diferente, não versão web quando executado em testes de unidade, portanto, desacoplando seu controlador da web.
Além das outras respostas aqui, embora
Controller.Session
não esteja preenchido no construtor, você ainda pode acessar a sessão por meio de:System.Web.HttpContext.Current.Session
com a advertência padrão de que isso reduz potencialmente a testabilidade do seu controlador.
fonte
A Sessão é injetada posteriormente no ciclo de vida. Por que você precisa da sessão no construtor de qualquer maneira? Se você precisar dele para o TDD, deve envolver a sessão em um objeto mockable.
fonte
Você pode substituir o método Initialize para definir sua sessão.
fonte
Se você estiver usando um contêiner IoC, tente injetar e usar o em
HttpSessionStateBase
vez doSession
objeto:fonte
Esta resposta pode ser útil para algumas pessoas
Se substituirmos o método Initialize, teremos que inicializar a classe base com o contexto de solicitação: base.Initialize (requestContext);
fonte
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
.