Eu realmente gostaria de atualizar as variáveis de sessão de um usuário de dentro do meu HTTPModule, mas pelo que posso ver, não é possível.
ATUALIZAÇÃO: Meu código está em execução no OnBeginRequest ()
manipulador de eventos.
ATUALIZAÇÃO: Seguindo os conselhos recebidos até agora, tentei adicionar isso à Init ()
rotina em meu HTTPModule:
AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute
Mas na minha OnPreRequestHandlerExecute
rotina, o estado da sessão ainda está indisponível!
Obrigado e desculpas se estou faltando alguma coisa!
asp.net
session-state
httpmodule
Chris Roberts
fonte
fonte
HttpContext.Current.Session deve apenas funcionar, supondo que seu Módulo HTTP não esteja lidando com nenhum evento de pipeline que ocorra antes do estado da sessão ser inicializado ...
EDIT, após esclarecimento nos comentários: ao manipular o evento BeginRequest , o objeto Session ainda será null / Nothing, pois ainda não foi inicializado pelo runtime do ASP.NET. Para contornar isso, mova seu código de tratamento para um evento que ocorre após PostAcquireRequestState - eu mesmo gosto de PreRequestHandlerExecute para isso, pois todo o trabalho de baixo nível é praticamente concluído neste estágio, mas você ainda impede qualquer processamento normal.
fonte
O acesso ao
HttpContext.Current.Session
em aIHttpModule
pode ser feito noPreRequestHandlerExecute
manipulador.PreRequestHandlerExecute : "Ocorre pouco antes do ASP.NET começar a executar um manipulador de eventos (por exemplo, uma página ou um serviço da Web em XML)." Isso significa que antes de uma página 'aspx' ser exibida, esse evento é executado. O 'estado da sessão' está disponível para que você possa se surpreender.
Exemplo:
public class SessionModule : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += BeginTransaction; context.EndRequest += CommitAndCloseSession; context.PreRequestHandlerExecute += PreRequestHandlerExecute; } public void Dispose() { } public void PreRequestHandlerExecute(object sender, EventArgs e) { var context = ((HttpApplication)sender).Context; context.Session["some_sesion"] = new SomeObject(); } ... }
fonte
Se você estiver escrevendo um HttpModule normal e básico em um aplicativo gerenciado que deseja aplicar às solicitações asp.net por meio de páginas ou manipuladores, você apenas precisa ter certeza de que está usando um evento no ciclo de vida após a criação da sessão. PreRequestHandlerExecute em vez de Begin_Request é geralmente onde eu vou. mdb tem direito em sua edição.
O trecho de código mais longo listado originalmente como resposta à pergunta funciona, mas é complicado e mais amplo do que a pergunta inicial. Ele tratará do caso em que o conteúdo está vindo de algo que não tem um manipulador ASP.net disponível onde você pode implementar a interface IRequiresSessionState, acionando assim o mecanismo de sessão para torná-lo disponível. (Como um arquivo gif estático no disco). Basicamente, é definir um manipulador fictício que apenas implementa essa interface para disponibilizar a sessão.
Se você deseja apenas a sessão para seu código, basta escolher o evento certo para manipular em seu módulo.
fonte
Experimente: na classe MyHttpModule declare:
private HttpApplication contextapp;
Então:
public void Init(HttpApplication application) { //Must be after AcquireRequestState - the session exist after RequestState application.PostAcquireRequestState += new EventHandler(MyNewEvent); this.contextapp=application; }
E assim, em outro método (o evento) na mesma classe:
public void MyNewEvent(object sender, EventArgs e) { //A example... if(contextoapp.Context.Session != null) { this.contextapp.Context.Session.Timeout=30; System.Diagnostics.Debug.WriteLine("Timeout changed"); } }
fonte