2011-01-27 2 views
22

세션이 만료되면 사용자를 로그 아웃하려고합니다. 그래서 Global.asax에에 다음 코드를 사용 :Session_End가 실행되지 않습니까?

protected void Session_End(object sender, EventArgs e) 
{ 
    FormsAuthentication.SignOut(); 
} 

그러나 session_end가 터지지 않 보인다. 어떤 생각을 어떻게 고칠 수 있습니까? ASP.NET을 기본 설정으로 사용하고 있습니다.

+3

에서

public void Session_End(Object sender, SessionEndedEventArgs e) { } 

콜이? – leppie

+0

@leppie : 확실히 예! 나는 또한이 행을 다음으로 대체했다 : "새로운 예외 (" ") 던짐;" 그러나 여전히 작동하지 않습니다. –

+0

@InSane : 어떻게 보장 할 수 있습니까? 내 세션이 실제로 특정 시간 후에 만료된다는 것을 알고 있습니다. 그래서 그것은 InProc 인 것 같습니다. –

답변

34

당신은으로 session_start 일부 세션 데이터를 설정할 수 있어야합니다. 이것이 없으면 Session_End는 시작되지 않습니다. 또한 여기에서 주목해야 할 또 다른 매우 중요한 것은 당신이 세션에 아무것도 저장하지 않으면 Session_End 이벤트가 발생하지 것입니다 this

참조하십시오. Session_End 이벤트가 발생하기 위해서는 적어도 한 번 세션에 저장된 것이 있어야합니다. 이것은 또한 첫 번째 요청에서 세션에 무언가를 저장하고 동일한 요청으로 세션을 포기하면 Sesison_End 이벤트가 실행되지 않는다는 것을 의미합니다. 세션에 아무 것도 저장되지 않았기 때문입니다.

+4

이것은 받아 들여진 응답이어야한다 –

+0

아주 재미있는; 내가 모르는 뭔가. 또한 많은 의미가 있습니다. IMHO, 대답입니다. – nocarrier

+0

나는 Dubya에 동의합니다. –

1

절대 발생하지 않습니까?

잘 알고 있듯이 Session_End은 클라이언트의 마지막 요청이 도착한 후 ASP.NET 세션이 시간 초과로 종료되기 때문에 현재 요청과 아무 관련이 없습니다. FormsAuthenticaion.SignOut에 대한 호출은 인증 쿠키를 조작하므로 클라이언트 (브라우저)의 연결 없이는 효과가 없습니다.

은 (답변이있는)이 문제를 살펴 보자 - 문제가 더 많거나 적은 당신과 유사 당신이 적합한 솔루션을 찾을 수 있도록 :이 도움이

Session_End in Global.asax.cs not firing using forms authentication

희망을. 당신의 Web.config에서

5

당신이 요소

<configuration> 
    <system.web> 
      <sessionState mode="InProc" /> 
      ..... 
    </system.web> 
</configuration> 
+1

도 가치가 있습니다. Session_End는 InProc이 아닌 다른 sessionState와 함께 작동하지 않습니다. – Phill

+0

세션을 InProc로 변경했습니다. 하지만 session_end는 아직 시작되지 않습니다. –

+3

IIS 나 Visual Studio에서 실행하고 있습니까? WebDev와 함께 VisualStudio에 있으면 이벤트가 발생하지 않을 것입니다. 이를 테스트하려면 웹 사이트를 IIS에두고 w3wp.exe – Phill

5

나도 몰라의 자식으로 sessionState의 요소가 필요, 그것은 기능이나 버그입니다. 아니면 ASP.NET에서 충분한 세션 관리를 이해하지 못할 수도 있습니다. 그러나 이것이 내가 찾은 것입니다.

Session_Start가 선언되지 않은 경우 Session_End가 ASP.NET MVC 4에서 실행되지 않습니다 (web.config의 sessionState 요소에 대한 기본 설정 사용).

그래서 당신은 Session_End을 잡으려고으로 session_start를 선언 :

protected void Session_Start(Object sender, EventArgs e) { } 

protected void Session_End(Object sender, EventArgs e) { 
    Debug.WriteLine("End. " + Session.SessionID); 
} 
+1

고맙습니다. –

0

나는 어떻게 작동하는지 알지 못하지만 시간이 지나면 브라우저를 닫을 때 작동하지 않습니다. 당신이 정말로 해고 이벤트에 그 20 분 동안 기다리나요

Application_Start() Event 

    SessionEndModule.SessionEnd += new SessionEndEventHandler(Session_End); 
관련 문제