Naprawdę przydałaby mi się aktualizacja zmiennych sesji użytkownika z poziomu mojego modułu HTTPModule, ale z tego, co widzę, nie jest to możliwe.
AKTUALIZACJA: Mój kod jest obecnie uruchomiony w programie OnBeginRequest ()
obsługi zdarzeń.
AKTUALIZACJA: Zgodnie z otrzymanymi dotychczas poradami próbowałem dodać to do Init ()
procedury w moim module HTTPModule:
AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute
Ale w mojej OnPreRequestHandlerExecute
rutynie stan sesji jest nadal niedostępny!
Dzięki i przepraszam, jeśli czegoś brakuje!
asp.net
session-state
httpmodule
Chris Roberts
źródło
źródło
HttpContext.Current.Session powinien po prostu działać, zakładając, że moduł HTTP nie obsługuje żadnych zdarzeń potoku, które występują przed zainicjowaniem stanu sesji ...
EDYTUJ, po wyjaśnieniu w komentarzach: podczas obsługi zdarzenia BeginRequest obiekt Session rzeczywiście nadal będzie miał wartość null / Nothing, ponieważ nie został jeszcze zainicjowany przez środowisko uruchomieniowe ASP.NET. Aby obejść ten problem, przenieś kod obsługi do zdarzenia, które występuje po PostAcquireRequestState - osobiście lubię PreRequestHandlerExecute , ponieważ cała praca na niskim poziomie jest prawie wykonywana na tym etapie, ale nadal poprzedzasz normalne przetwarzanie.
źródło
Dostęp do
HttpContext.Current.Session
w aIHttpModule
można wykonać w programiePreRequestHandlerExecute
obsługi.PreRequestHandlerExecute : „Występuje tuż przed rozpoczęciem wykonywania programu obsługi zdarzeń przez program ASP.NET (na przykład strony lub usługi sieci Web XML).” Oznacza to, że przed udostępnieniem strony „aspx” to zdarzenie zostanie wykonane. „Stan sesji” jest dostępny, więc możesz się znokautować.
Przykład:
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(); } ... }
źródło
Jeśli piszesz normalny, podstawowy moduł HttpModule w zarządzanej aplikacji, którą chcesz zastosować do żądań asp.net za pośrednictwem stron lub programów obsługi, wystarczy upewnić się, że używasz zdarzenia w cyklu życia po utworzeniu sesji. Zwykle wybieram PreRequestHandlerExecute zamiast Begin_Request. mdb ma to w swojej edycji.
Dłuższy fragment kodu pierwotnie wymieniony jako odpowiedź na pytanie działa, ale jest skomplikowany i szerszy niż początkowe pytanie. Będzie obsługiwał przypadek, gdy zawartość pochodzi z czegoś, co nie ma dostępnej procedury obsługi ASP.net, w której można zaimplementować interfejs IRequiresSessionState, uruchamiając w ten sposób mechanizm sesji, aby ją udostępnić. (Jak statyczny plik gif na dysku). Zasadniczo polega na ustawieniu fikcyjnej obsługi, która następnie implementuje ten interfejs, aby udostępnić sesję.
Jeśli potrzebujesz tylko sesji dla swojego kodu, po prostu wybierz odpowiednie zdarzenie do obsługi w swoim module.
źródło
Spróbuj: w klasie MyHttpModule zadeklaruj:
private HttpApplication contextapp;
Następnie:
public void Init(HttpApplication application) { //Must be after AcquireRequestState - the session exist after RequestState application.PostAcquireRequestState += new EventHandler(MyNewEvent); this.contextapp=application; }
I tak w innej metodzie (zdarzeniu) w tej samej klasie:
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"); } }
źródło