Как выполнить код на стороне сервера непосредственно перед истечением срока действия переменной сеанса asp.net? - PullRequest
2 голосов
/ 07 октября 2010

На моем веб-сайте asp.net я создаю сеанс при входе пользователя в систему и хотел бы выполнить некоторые операции в базе данных непосредственно перед истечением этого сеанса. У меня возникла проблема с определением того, где я должен написать код и как я буду это делать.знаю, что сессия истекает.

Я не уверен, что событие 'session_end' файла 'Global.asax' соответствует моим требованиям, так как сеанс, который я хочу проверить, создается вручную (не экземпляр браузера).

Может кто-нибудь, пожалуйста, направить меня в правильном направлении?

Спасибо.

1 Ответ

3 голосов
/ 07 октября 2010

Это может быть довольно сложно, а именно потому, что метод Session_End поддерживается только тогда, когда режим сеанса установлен в InProc. Что вы могли бы сделать, это использовать IHttpModule, который отслеживает элемент, сохраненный в сеансе, и запускает событие по истечении сеанса. Существует пример над CodeProject (http://www.codeproject.com/KB/aspnet/SessionEndStatePersister.aspx),, но он не без ограничений, например, он не работает в сценариях webfarm.

Используя технику Мунсифали, вы можете сделать:

<httpModules>
 <add name="SessionEndModule" type="SessionTestWebApp.Components.SessionEndModule, SessionTestWebApp"/>
</httpModules>

А затем подключите модуль при запуске приложения:

protected void Application_Start(object sender, EventArgs e)
{
  // In our sample application, we want to use the value of Session["UserEmail"] when our session ends
  SessionEndModule.SessionObjectKey = "UserEmail";

  // Wire up the static 'SessionEnd' event handler
  SessionEndModule.SessionEnd += new SessionEndEventHandler(SessionTimoutModule_SessionEnd);
}

private static void SessionTimoutModule_SessionEnd(object sender, SessionEndedEventArgs e)
{
   Debug.WriteLine("SessionTimoutModule_SessionEnd : SessionId : " + e.SessionId);

   // This will be the value in the session for the key specified in Application_Start
   // In this demonstration, we've set this to 'UserEmail', so it will be the value of Session["UserEmail"]
   object sessionObject = e.SessionObject;

   string val = (sessionObject == null) ? "[null]" : sessionObject.ToString();
   Debug.WriteLine("Returned value: " + val);
}

Затем, когда начинается сессия, вы можете добавить некоторые пользовательские данные:

protected void Session_Start(object sender, EventArgs e)
{
   Debug.WriteLine("Session started: " + Session.SessionID);

   Session["UserId"] = new Random().Next(1, 100);
   Session["UserEmail"] = new Random().Next(100, 1000).ToString() + "@domain.com";

   Debug.WriteLine("UserId: " + Session["UserId"].ToString() + ", UserEmail: " + 
                 Session["UserEmail"].ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...