No meu aplicativo da web, faço algo assim para ler as variáveis da sessão:
if (HttpContext.Current.Session != null && HttpContext.Current.Session["MyVariable"] != null)
{
string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}
Entendo por que é importante verificar por que o HttpContext.Current.Session ["MyVariable"] é nulo (a variável pode ainda não ter sido armazenada na sessão ou a sessão foi redefinida por vários motivos), mas por que preciso verificar se HttpContext.Current.Session
é nulo?
Meu entendimento é que a sessão é criada automaticamente pelo ASP.NET, portanto, HttpContext.Current.Session nunca deve ser nulo. Essa suposição está correta? Se puder ser nulo, significa que eu também devo verificá-lo antes de armazenar algo nele:
if (HttpContext.Current.Session != null)
{
HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
// What should be done in this case (if session is null)?
// Is it possible to force the session to be created if it doesn't exist?
}
Respostas:
Sim, o objeto Session pode ser nulo, mas apenas em determinadas circunstâncias, nas quais você raramente encontrará:
Se você tiver apenas código nas páginas, não encontrará isso. A maior parte do meu código ASP .NET usa Session sem verificar nulo repetidamente. É, no entanto, algo para se pensar se você estiver desenvolvendo um IHttpModule ou se houver outros detalhes nos detalhes do ASP .NET.
Editar
Em resposta ao comentário: A disponibilidade ou não do estado da sessão depende se o evento AcquireRequestState foi executado para a solicitação. É aqui que o módulo de estado da sessão funciona, lendo o cookie da sessão e localizando o conjunto apropriado de variáveis de sessão para você.
AcquireRequestState é executado antes do controle ser entregue à sua página. Portanto, se você estiver chamando outra funcionalidade, incluindo classes estáticas, da sua página, você deve ficar bem.
Se você tiver algumas classes executando a lógica de inicialização durante a inicialização, por exemplo, no evento Application_Start ou usando um construtor estático, o estado da Sessão poderá não estar disponível. Tudo se resume a se há uma solicitação atual e se o AcquireRequestState foi executado.
Além disso, se o cliente tiver desativado os cookies, o objeto Session ainda estará disponível - mas, na próxima solicitação, o usuário retornará com uma nova Sessão vazia. Isso ocorre porque o cliente recebe uma bolsa de estado da Sessão se ainda não a possui. Se o cliente não transportar o cookie da sessão, não temos como identificá-lo como o mesmo, portanto, ele receberá uma nova sessão repetidamente.
fonte
HttpContext.Current.Session
pode ser nulo no código em `Application_AcquireRequestState '. A solicitação para a própria página, no entanto, disponibiliza o objeto de sessão para codificar nela. Isso está no MVC.NET 4, pelo menos.A declaração a seguir não é totalmente precisa:
Estou chamando um método estático que referencia a sessão através de HttpContext.Current.Session e é nulo. No entanto, estou chamando o método por meio de um método de serviço da web por meio do ajax usando jQuery.
Como descobri aqui, você pode corrigir o problema com um atributo simples no método ou usar o objeto de sessão de serviço da web:
Obrigado a Matthew Cozier pela solução.
Só pensei em adicionar meus dois centavos.
Ed
fonte
the default value is false
. Funciona como um encanto.Se sua instância de Sessão for nula e a sua em um arquivo 'ashx', apenas implemente a interface 'IRequiresSessionState'.
Essa interface não possui nenhum membro, portanto, você só precisa adicionar o nome da interface após a declaração da classe (C #):
fonte
Artigos técnicos do ASP.NET
EDITAR:
Sessão: Um Conceito para Iniciantes
fonte
No meu caso
ASP.NET State Service
foi parado. Alterar oStartup type
paraAutomatic
e iniciar o serviço manualmente pela primeira vez resolveu o problema.fonte