2009-07-14 4 views
4

해당 사이트에서 얼마나 많은 사람들이 온라인 상태인지 보여줘야합니다. 이 사이트는 ASP.NET 2.0을 사용하여 개발되었습니다. 현재 Global.asax에서 세션 시작 (1 씩 증가) 및 세션 종료 이벤트 (1 씩 감소)를 사용하고 있습니다. 그러나 Session_End 이벤트는 대부분의 시간을 제대로 호출하지 않습니다. 이것을 달성하기위한 더 좋은 방법이 있습니까?웹 사이트에서 얼마나 많은 사람들이 온라인 상태인지 찾는 방법

+0

ASP.NET 멤버 자격 공급자를 사용하고 있습니까? 같은 SqlMembershipProvider? –

답변

3

우리는 여러 가지 방법을 시도한 후에도 각 사용자의 유휴 시간 추적으로 끝나고 유휴 시간이 세션 시간 초과를 넘으면 사용자가 더 이상 온라인 상태가 아닌 것으로 간주합니다. 물론 사용자가 로그 오프하거나 다시 시간 초과 후 다시 로그인하는 것과 같은 다른 문제를 고려해야합니다.

5

Session_Start에서 증가하고 사용하지 않으면 Session_End에서 감소합니다. 데이터베이스 같은 다른 수단.

요청을 인증 할 때 데이터베이스의 타임 스탬프를 업데이트하여 사용자가 활성 상태임을 표시하고 지정된 시간 (예 : 15 분) 후에 동시 사용자 수를 수집하는 쿼리는 해당 행을 무시합니다 (카운트를 감소 시킴).

4

빠른 Google 검색 결과 HttpModule이 handy way of doing this 인 것으로 나타났습니다.

전체적으로 Yohann은 이와 관련하여 훌륭한 업무를 수행했습니다. 위에 제안 된 시간 제한을 구현하지만 그렇지 않은 경우에는 서버의 perfmon.exe를 확인하고 WebService >> WebAppPool의 현재 연결 수를 확인하는 것 외에는이를 정확하게 수행 할 방법이 없습니다.

내가 직접 구현 한 SQL Server 테이블을 사용하여 날짜/시간 및 사용자 정보를 인증에 저장했습니다. 필자는 데이터 캐시를 새로 고쳐야 할 때마다 IP 주소를 다시 분석하고 일치시킴으로써이 수를 줄였습니다 (매 10 분마다 한 번씩).

+0

+1 매우 건전한 접근 방식처럼 들립니다. SQL Server를 사용하여 저장소를 백업하려면 웹 팜 구현에 필요합니다 (세션 저장소에 Velocity와 같은 것을 사용하지 않는 한). 미래의 실험을 위해 북마크되었습니다. 감사! –

3

이전에 해보았지만 수동으로 세션 (Session.Abandon)을 삭제 한 경우에만 Session_End가 호출된다는 사실을 입증 할 수 있습니다. 당신이 그것에 대해 생각할 때, 그것은 의미가 있습니다. 사용자가 웹 사이트에 있지 않으면 코드가 실행되지 않습니다.

내가 한 것은 사용자가 사이트에서 마지막으로 본 사용자 이름과 날짜 시간을 포함하는 응용 프로그램 상태에 해시 테이블을 저장하는 것이 었습니다. 모든 페이지로드에 대해 현재 사용자에 대해이 값을 삽입하거나 업데이트하는 함수를 호출합니다. 그런 다음 전체 목록을 삭제하고 세션 시간 초과 (20 분 또는 그 이상)보다 오래된 모든 항목을 제거합니다. 이 목록을 변경할 때 경쟁 조건을 피하려면 잠금 또는 동기화를 사용해야합니다.

이렇게하면 몇 명의 사용자를 알 수있을뿐만 아니라 특정 사용자를 알 수있는 이점이 있습니다.

사용자 이름과 같은 고유 한 이름이없는 경우 대신 Session.SessionID를 사용할 수 있습니다. 귀하의 사이트 방문자마다 고유해야합니다.

"웹 가든 모드"또는 다중 서버 설정에서 프로세스간에 공유하지 않으므로 응용 프로그램 또는 App 인스턴스 상태 변수에 자체적으로 문제가 발생하므로주의해야합니다. 더 큰 규모의 설정을 위해서는 데이터베이스 또는 분산 캐시와 같이보다 영구적 인 매체가 필요합니다.

관련 문제