Ну, я действительно не нашел способа получить доступ к Session
запроса из события LogRequest
, поэтому я просто подписался на другое событие:
public void Init(HttpApplication context) {
context.PostRequestHandlerExecute += OnLogRequest;
//context.LogRequest += OnLogRequest;
}
(я знаюЯ ленивый, я не изменил имя обработчика событий, но это потому, что я бы предпочел, чтобы оно означало, что оно делает, а не какое событие к нему прикреплено :-))
После этогоЯ был в состоянии получить доступ к сеансу для каждого запроса, который имел фактический сеанс.
Однако я столкнулся с еще одной «проблемой»: ASP.NET повторно использует идентификатор сеанса, сохраненный в файле cookie, для последующих запросов, даже после выхода пользователя из системы.Поскольку я хотел использовать идентификатор сеанса для «группировки» каждого «сеанса входа в систему» каждого пользователя, мне пришлось очистить идентификатор сеанса, чтобы принудительно использовать новый.Для этого я создал метод расширения, чтобы отменить сеанс и очистить его идентификатор сеанса:
public static void AbandonAndClearSessionCookie(this HttpSessionState session) {
session.Clear();
session.Abandon();
if (HttpContext.Current != null && HttpContext.Current.Response != null)
HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
}
Примечание: Этот метод не является надежным, и имя файла cookie идентификатора сеанса можно изменить вweb.config
файл.Я в основном обязательно улучшу предыдущий код.
Тогда было важно использовать его, когда пользователь вышел из системы:
protected void HeadLoginStatus_LoggingOut(object sender, System.Web.UI.WebControls.LoginCancelEventArgs e) {
Session.AbandonAndClearSessionCookie();
}
Я просто прикрепил обработчик событийк событию HeadLoginStatus.LoggingOut
.
В ASP.NET MVC мне пришлось написать его по методу AuthController.Logout
:
public ActionResult Logout() {
FormsAuthentication.SignOut();
Session.AbandonAndClearSessionCookie();
return RedirectToAction("Index", "Home");
}