(Atualizado para ser completo)
Você pode acessar variáveis de sessão de qualquer página ou controle usando Session["loginId"]
e de qualquer classe (por exemplo, de dentro de uma biblioteca de classes), usandoSystem.Web.HttpContext.Current.Session["loginId"].
Mas leia a minha resposta original ...
Eu sempre uso uma classe de wrapper em torno da sessão do ASP.NET para simplificar o acesso às variáveis da sessão:
public class MySession
{
// private constructor
private MySession()
{
Property1 = "default value";
}
// Gets the current session.
public static MySession Current
{
get
{
MySession session =
(MySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new MySession();
HttpContext.Current.Session["__MySession__"] = session;
}
return session;
}
}
// **** add your session properties here, e.g like this:
public string Property1 { get; set; }
public DateTime MyDate { get; set; }
public int LoginId { get; set; }
}
Essa classe armazena uma instância própria na sessão do ASP.NET e permite que você acesse as propriedades da sessão de maneira segura, a partir de qualquer classe, por exemplo:
int loginId = MySession.Current.LoginId;
string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;
DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;
Esta abordagem tem várias vantagens:
- ele evita que você seja vítima de muitas transmissões de tipos
- você não precisa usar chaves de sessão codificadas em todo o aplicativo (por exemplo, Session ["loginId"]
- você pode documentar os itens da sua sessão adicionando comentários de documentos XML nas propriedades do MySession
- você pode inicializar suas variáveis de sessão com valores padrão (assegurando que eles não sejam nulos)
Acesse a sessão através dos tópicos HttpContext: -
fonte
O problema com a solução sugerida é que ele pode interromper alguns recursos de desempenho incorporados no SessionState se você estiver usando um armazenamento de sessão fora de processo. ("State Server Mode" ou "SQL Server Mode"). Nos modos oop, os dados da sessão precisam ser serializados no final da solicitação de página e desserializados no início da solicitação de página, o que pode ser caro. Para melhorar o desempenho, o SessionState tenta desserializar apenas o necessário, desserializando apenas a variável quando é acessado pela primeira vez, e apenas re-serializa e substitui a variável que foi alterada. Se você possui muitas variáveis de sessão e as coloca em uma única classe, basicamente tudo na sua sessão será desserializado em todas as solicitações de página que usam a sessão e tudo precisará ser serializado novamente, mesmo que apenas uma propriedade seja alterada porque a classe foi alterada. Apenas algo a considerar se você estiver usando um monte de sessão e um modo oop.
fonte
As respostas apresentadas antes das minhas fornecem soluções adequadas para o problema, no entanto, sinto que é importante entender por que esse erro ocorre:
A
Session
propriedade doPage
retorna uma instância do tipoHttpSessionState
relativa a essa solicitação específica.Page.Session
é realmente equivalente a chamarPage.Context.Session
.O MSDN explica como isso é possível:
No entanto, quando você tenta acessar esta propriedade dentro de uma classe em App_Code, a propriedade não estará disponível para você, a menos que sua classe derive da Classe de Página.
Minha solução para esse cenário frequentemente encontrado é que nunca passo objetos de página para classes . Eu preferiria extrair os objetos necessários da página Session e passá-los para a classe na forma de uma coleção / matriz / lista de valor-nome, dependendo do caso.
fonte
Eu tive o mesmo erro, porque estava tentando manipular variáveis de sessão dentro de uma classe Session personalizada.
Eu tive que passar o contexto atual (system.web.httpcontext.current) para a classe e tudo deu certo.
MA
fonte
No núcleo do asp.net, isso funciona de maneira diferente:
Fonte: https://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/
fonte
Isso deve ser mais eficiente para o aplicativo e também para o desenvolvedor.
Adicione a seguinte classe ao seu projeto da web:
Aqui está a implementação:
fonte