Как подписаться на SessionStateItemExpireCallback в asp.net mvc - PullRequest
0 голосов
/ 12 марта 2011

Я много искал об этом, но не нашел конкретного примера реального использования. MSDN много говорит о реализации пользовательского поставщика состояния сеанса, но я не хочу этого делать. Может ли кто-нибудь посоветовать, как я могу выполнить некоторые действия по истечении сеанса

USECASE: Тайм-аут сеанса 10 минут. Пользователь открывает страницу, и создается сеанс. Приложение помечает пользователя в базе данных как вошедшего в систему. Через одну минуту после открытия страницы пользователь закрывает браузер, поэтому через 9 минут сеанс истекает, и приложение должно выполнить некоторый код, чтобы пометить пользователя как отключенного.

Заранее спасибо!

1 Ответ

0 голосов
/ 12 марта 2011

Вы можете попробовать подписаться на событие Session_End в Global.asax:

protected void Session_End()
{
    ...
    // Remark: don't use Context here, it will be null as the
    // user might have closed his browser long ago => no request/response
    // You could get the corresponding Session.SessionID though
}

Следует отметить, что это событие вызывается только в том случае, если вы используете сеанс InProc. В режимах SqlServer и StateServer это событие никогда не вызывается просто потому, что при реализации соответствующих им поставщиков состояния сеанса метод SetItemExpireCallback просто возвращает false. Цитирование

Как сделать состояние встроенного сеанса провайдеры обрабатывают обратные вызовы истечения срока действия? Поставщик состояния сеанса в процессе, InProcSessionStateStore, магазины содержимое сеанса в ASP.NET кеш приложения и пользуется скольжения-истечения кеша функция истечения сессий, когда они перейти на указанный период времени без доступа. Когда провайдер уведомляется через кеш удаление обратного вызова, что сеанс истек срок действия кеша, уведомляет SessionStateModule и SessionStateModule запускает Session_End событие. Два других встроенных поставщики-OutOfProcSessionStateStore и SqlSessionStateStore - не поддерживают истечения обратного вызова. Оба возвращаются false от SetItemExpireCallback. OutOfProcSessionStateStore использует кеш приложения для хранения сессий, но так как данные сеанса хранятся в удаленный процесс («сервер состояний» процесс), провайдер не пытается уведомить SessionStateModule, когда сессия истекает. SqlSessionStateStore полагается на агент SQL Server для «очистить» базу данных состояния сеанса и убирать просроченные сессии. имеющий агент уведомляет провайдера о сеансы с истекшим сроком действия, поэтому поставщик мог бы, в свою очередь, уведомить SessionStateModule будет сложно усилия действительно - особенно в сети фермы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...