Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > логирование зарегистрированных юзеров


Автор: AleXGray 2.12.2007, 18:34
Очень хотелось бы получить ответ на следующую проблему.
Делаю систему логирования для сайта для зарегистрированных пользователей.
Для этого у меня на каждого есть файлик, где пишется его лог. Использую  Global.asax, где в 

Application_EndRequest перехватываю запросы и пишу в соответствующий файлик нужную инфу.
Проблема в том, что я не знаю как поймать событие "завершения сессии" юзера...
в Session_End я хотел, но оттуда я уже не могу добраться до имени юзера, для которого 

завершилась сессия...
В Application_EndRequest хотел связать идентификатор сессии и текущего юзера через 

Application[Session.SessionID] = username , но получил ошибку, типа некорректно 

использовать session state в этом обработчике...
В общем хотелось бы идею, как мне все-таки выловить этого уходящего юзера...

Автор: Servena 2.12.2007, 20:54
А как ты думаешь, сервер знает, что пользователь ушел?
Если на сайте есть кнопке Логаут с соответствующей функцией - то будет знать. 
А так, только если по истечению некоторого времени пользователь не проявит никаких действий - тогда он ушел.


Автор: Mymik 2.12.2007, 21:19
AleXGray, теоретически уход пользователя нельзя отследить. Ибо непонятно ушел он встречать гостей или в туалет захотелось человеку, или он закрыл окно. Совсем чуть-чуть, тебе может помочь событие onclose у body (это JavaScript'овое событие). По этому событию отправлять оповещение о том что пользователь закрыл окно... отправлять с помощью AJAX. дабы не задерживать браузер пользователя.
Но ИМХО это все очень муторно и не правильно.
У меня подобная система в проекте реализованная, для того чтобы под одним login не могло одновременно работать несколько человек. Там перехват BeginRequest в Global.asax идет. и записываем SessionID в базу данных. Там есть несколько полей. Типа SessionID, Username, LoginDate, LogoutDate, LastAction. Ну а дальше update таблицe, или insert делаю.

Так вот. Если пользователь ушел с сайта. А потом заходит на сайт опять. А он ушел не через logout а через Ctrl+W то при логине я обновляю таблицу путем прописывания последней даты логина в LastAction и делаю insert с новыми данными. Если же пользователь ушел с сайта путем Ctrl+W и потом зашел в другой браузер и опять пытается залогинится. То я проверяю. Мол если погрешность в последним LastAction и переданным временем действия больше чем 10 минут, то я пускаю, а иначе откидываю ошибку.

Я к тому, что тебе это тоже очень хорошо поможет. У меня это реализовано не только для запрета множественного логина, но и для Report'ов о проведенном времени пользователей на сайте.

Добавлено через 6 минут и 27 секунд
Servena, 
Цитата(Servena @  2.12.2007,  20:54 Найти цитируемый пост)
А так, только если по истечению некоторого времени пользователь не проявит никаких действий - тогда он ушел.

Я немножко не согласен с этим. Для сервере пользователь уходит когда удаляется объект класса запрошенной странице (когда все данные отправлены в Response). И дальше. Session это тот же объект, у которого есть некоторое время жизни (но он совсем не зависит от пользователя... Ну т.е. SessionID то передается в Cookie, а без SessionID мы бы вообще не смогли достучаться до сессии).
Это все равно что пойти и купить билет в театр. Ты пришел, дал деньги за билет (ввел login/password) получил билет, ушел. Для всех структур театра ты ушел. Потом ты приходишь и даешь билет для входа (это cookie авторизации). Дальше ты начинаешь юзать театр. Садишься на свое место (это взаимодействие role и cookie авторизации) smile

Автор: AleXGray 3.12.2007, 00:25
 Со всем вышесказанным ув. Mymik согласен (примерно так и делал, только без базы), значит по глобальному я на правильном пути, и теперь могу уточнить проблему:
Пишу тестовый код в Global.asax
Код

void Application_BeginRequest(object sender, EventArgs e)
    {
        string a = Session.SessionID;
    }


Получаю ошибку:  Session state is not available in this context

Почему? smile 
или может быть дадите код Application_BeginRequest для Вашего случая?...

Автор: AleXGray 3.12.2007, 03:41
Mymik 

Разобрался. Надо писать:
Код

SessionIDManager s = new SessionIDManager();
string id = s.GetSessionID(HttpContext.Current);

спасибо за толчок в правильном направлении.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)