Я действительно мог бы обновить переменные сеанса пользователя из моего HTTPModule, но из того, что я вижу, это невозможно.
ОБНОВЛЕНИЕ: мой код в настоящее время выполняется внутри OnBeginRequest ()
обработчика событий.
ОБНОВЛЕНИЕ: Следуя полученным до сих пор советам, я попытался добавить это в Init ()
подпрограмму в моем HTTPModule:
AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute
Но в моем OnPreRequestHandlerExecute
распорядке состояние сеанса по-прежнему недоступно!
Спасибо и извиняюсь, если я что-то упускаю!
asp.net
session-state
httpmodule
Крис Робертс
источник
источник
HttpContext.Current.Session должен просто работать, если ваш HTTP-модуль не обрабатывает какие-либо события конвейера, которые происходят до инициализации состояния сеанса ...
ИЗМЕНИТЬ, после пояснения в комментариях: при обработке события BeginRequest объект Session действительно будет иметь значение null / Nothing, поскольку он еще не был инициализирован средой выполнения ASP.NET. Чтобы обойти это, переместите свой код обработки в событие, которое происходит после PostAcquireRequestState - мне лично нравится PreRequestHandlerExecute , так как вся низкоуровневая работа в значительной степени выполняется на этом этапе, но вы все равно предотвращаете любую нормальную обработку.
источник
Доступ к
HttpContext.Current.Session
inIHttpModule
может быть выполнен вPreRequestHandlerExecute
обработчике.PreRequestHandlerExecute : «Происходит непосредственно перед тем, как ASP.NET начинает выполнение обработчика событий (например, страницы или веб-службы XML)». Это означает, что перед обслуживанием страницы aspx это событие запускается. «Состояние сеанса» доступно, так что вы можете вырубить себя.
Пример:
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(); } ... }
источник
Если вы пишете обычный, базовый HttpModule в управляемом приложении, которое вы хотите применить к запросам asp.net через страницы или обработчики, вам просто нужно убедиться, что вы используете событие в жизненном цикле после создания сеанса. PreRequestHandlerExecute вместо Begin_Request обычно то место, куда я иду. mdb имеет это право в его редактировании.
Более длинный фрагмент кода, изначально указанный как ответ на вопрос, работает, но он сложнее и шире исходного вопроса. Он будет обрабатывать случай, когда контент поступает из чего-то, у кого нет доступного обработчика ASP.net, где вы можете реализовать интерфейс IRequiresSessionState, тем самым запуская механизм сеанса, чтобы сделать его доступным. (Как статический файл gif на диске). По сути, он устанавливает фиктивный обработчик, который затем просто реализует этот интерфейс, чтобы сделать сеанс доступным.
Если вам просто нужен сеанс для вашего кода, просто выберите правильное событие для обработки в вашем модуле.
источник
Попробуйте: в классе MyHttpModule объявите:
private HttpApplication contextapp;
Затем:
public void Init(HttpApplication application) { //Must be after AcquireRequestState - the session exist after RequestState application.PostAcquireRequestState += new EventHandler(MyNewEvent); this.contextapp=application; }
Итак, в другом методе (событии) того же класса:
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"); } }
источник