Это может быть довольно сложно, а именно потому, что метод 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());
}