В ASP.NET я ищу способ проверить пользователя, покидающего мое приложение. Чтобы быть конкретным, я хотел бы вставить запись о выходе из системы в таблицу аудита в SQL Server, когда сеанс пользователя прекращен / уничтожен по какой-либо причине (не обязательно из-за вызова session.abandon)
У меня есть класс SessionHelper, который управляет установщиками / получателями сеанса.
Я попытался отправить обратно в Session_End в Global.asax, но он никогда не запускал это событие даже после истечения тайм-аута.
Я пробовал переопределить finalize в классе SessionHelper и сделать это там, когда класс уничтожен, но это событие тоже не сработало.
Я бы попробовал реализовать IDisposable в SessionHelper, но я не знаю, где его вызвать, чтобы он всегда вызывался.
Как правильно контролировать пользователя, покидающего ваше приложение ASP.NET?
Спасибо!





Обратите внимание на «правильный способ», но вот как я делал это в прошлом.
Иметь отметку даты и времени «активно», связанную с записью пользователя в базе данных. Каждый раз, когда пользователь обращается к странице, она обновляется до текущего времени. Если кто-то не обращался к странице, скажем, 15 минут, то этот пользователь регистрируется как событие «выхода из системы», а метка времени устанавливается на NULL.
В лучшем случае ваша запись о выходе будет разумным предположением, даже если вы заставите события сеанса работать правильно, о том, когда пользователь покинул ваш сайт / приложение. Метод, который вы можете использовать, заключается в том, чтобы поместить время выхода из системы в базу данных, когда пользователь входит в систему, и просто продолжать обновлять запись с учетом будущего времени, когда они будут использовать систему. Вот общая схема недавно созданной мной сеансовой таблицы:
[Id] [Uid] [LoginInOn] [ExpiresOn]
1 johndoe 10/14/2008 10:47 10/14/2008 11:07
В этой таблице я просто продолжаю обновлять столбец ExpiresOn по мере взаимодействия пользователя с приложением (текущее время + 20 минут). Если они попытаются взаимодействовать после ExpiresOn, то я знаю, что они бездействовали в течение 20 минут, и принудительно выполнит новый вход. В целях отчетности я знаю, что пользователь вышел из системы, если текущее время больше ExpiresOn. Вы можете получить более сложный вариант. Например, я перемещаю свои данные из таблицы сеансов, указанной выше, в таблицу отчетов в обычном порядке. Это сделано для того, чтобы таблица сессий была небольшой, так как с ней взаимодействует множество вещей.
Событие Session_End запускается, только если у вас есть сеансы InProc. Управление сеансом SQL или сервера состояний не вызовет это событие. Если можете, вернитесь к сеансам InProc и используйте это событие.
В остальном хороших решений не получится. ASP.NET не предлагает способ просмотреть текущий список сеансов на сервере (по крайней мере, пользователи StackOverflow не знают об этом, поскольку я уже задавал вопрос), поэтому вы не можете использовать задание для проверьте, когда они будут уничтожены.
Следующим лучшим вариантом было бы сохранить где-нибудь «время последнего доступа» для ваших пользователей и использовать его для определения тайм-аута сеанса. Однако реализация такой работы сложна (вы можете пропустить события выхода, например, если пользователь входит / выходит быстро) ...
Так что идеального решения здесь нет.
Я делаю нечто подобное: я использую обработку сеанса на основе sql и имею последний столбец, к которому был осуществлен доступ, в таблице, содержащий данные моего сеанса. Существует хранимая процедура, которая запускается каждый раз при изменении записи сеанса, которая очищает таблицы от любых неиспользуемых строк сеанса, неактивных дольше, чем предопределенное значение TIMEOUT.