2009-09-21 3 views
2

Session_End를 잘못 사용하고 있습니까?Session_End가 세션 중간에 여러 번 호출되었습니다.

내 응용 프로그램에서 페이지로드 속도를 높이기 위해 캐시가 있는데, 꽤 잘 작동합니다. 최근에 누군가가 나에게 결코 메모리를 비우지 않고 메모리를 낭비하고 있으며 Session_End에 해당 세션 ID와 관련된 캐시 항목을 지우는 메소드를 구현할 것을 제안했습니다.

때때로 비정상적인 행동을보기 시작했는데. 페이지를로드 할 때 매우 드물게 비어있는 페이지가 표시되어 해당 페이지의 캐시가 비어 있기 때문에 예외가 표시됩니다. 캐시 액세스와 session_end 메소드에 디버거 중단 점을 두었습니다. 다음 번에 디버거 중단 지점을 잡으려고합니다.

다음에 일어난 일이 실제로 일어난 일에 상당히 놀랐습니다. 내 브라우저는 열어 두었지만 오랜 시간 동안 유휴 상태 였기 때문에 세션 쿠키가 오래되었다고 생각합니다. 페이지의 사본을 캐시에 저장하는 페이지 서버를 공격합니다. 페이지가로드되는 동안 Session_End가 즉시 호출되어 캐시에서 삭제됩니다. 브라우저를 새로 고침하면 Session_End가 계속 호출되어 가난한 브라우저가 계속 요청하는 세션을 닫으려고 시도합니다.

그래서 난 내 실제 질문은 가정 :

  • 없는 이유는 기존의 하나가 IIS에 그 anathemic 경우 새로운 세션 쿠키를 받고 브라우저?
  • Session_End는 이러한 방식으로 사용하도록 설계되지 않았습니까?
  • 내가하려는 일을하는 더 좋은 방법이 있습니까?

@Sosh - 내 global.asax.cs :

protected void Session_End(Object sender, EventArgs e) 
    { 
     //clean up object cache on session expiry 
     string sessionID = this.Session.SessionID; 

     foreach (string key in Global.DataGroups.Keys) 
     { 
      if (key.EndsWith(sessionID)) 
      { 
       Global.DataGroups.Remove(key); 
      } 
     } 
    } 
+0

global.asax를 볼 수 있습니까? – UpTheCreek

답변

1

예를 더 나은 방법이있다. 기본 제공 Cache 개체를 사용하십시오. 당신이 바퀴를 다시 발명 한 것처럼 보입니다 ... 캐시가 훨씬 더 신뢰할 수 있습니다. 만료 시간을 세션 시간 초과와 일치하도록 설정하십시오. 20 분마다 캐시를 ​​다시로드해야한다면 어떻게해야합니까?

일반적으로 나는 Session_End가 Application_End와 약간 유사하다는 것을 알았습니다. 이것은 언제 호출 될 지 확신 할 수 없으며 때로는 반 직관적입니다.

+0

팁을 주셔서 감사합니다. 솔직히 말해서 Cache 객체가 내장되어 있다는 사실을 모르고 있었고 모든 것을 처리해주었습니다. 이 질문을 읽는 다른 사용자의 경우, 이전에 해시 테이블과 똑같이 동작하도록 캐시 삽입 방법을 변경했는데 마지막 액세스 이후 20 분이 지나면 항목이 만료됩니다. 내 Session_End 메서드는 이제 아무 일도하지 않습니다. – Coxy

관련 문제