2011-03-14 3 views
5

내 양식 인증 쿠키가 계속 남아 있기 때문에 세션을 잃어 버렸거나 프로젝트를 다시 빌드 할 때 오류가 발생하기 시작했습니다.ASP.Net MVC 3 : 세션 손실을 처리 할 위치는 어디입니까?

WebForms에서는 단순히 세션을 확인하기 위해 로그인이 필요한 페이지와 관련된 마스터 페이지를 사용합니다.

MVC의 한 위치에서 어떻게 처리 할 수 ​​있습니까? 내 컨트롤러의 모든 동작에서 세션 상태를 확인하지 않아도됩니다.

반면에 모든 컨트롤러가 세션 상태를 필요로하지 않기 때문에 글로벌 필터를 적용 할 수 없습니다.

내 레이아웃보기에서 가능할 수 있습니까? 그것은 세션을 필요로하는 페이지가 공통적으로 가지고있는 유일한 것입니다.

답변

2

세션 상태가 필요한 컨트롤러를 하위 클래스로 분류하면됩니다. 이렇게하면이 기본 컨트롤러에서만 필터를 만들 수 있습니다. 이렇게하면 한 곳에서 모든 것을 할 수 있습니다. 또한, 로직이 모든 컨트롤러에 적용되지 않기 때문에 글로벌 필터가 도움이되지 않습니다.

+0

+1 이것은 좋은 생각 인 것 같습니다.하지만 컨트롤러에 체크인 할 수있는 중앙 지점이 있습니까? (내 기본 컨트롤러의 경우) – Steffen

+0

@Steffen - 목표는 DRY로 유지하고 코드에 논리를 한 번만 넣는 것입니다. 따라서이 기능이 필요한 곳에서만 상속받은 기본 컨트롤러를 만듭니다. 그런 다음이 컨트롤러의 클래스 선언에 필터를 적용하여 컨트롤러 (또는 그 하위 클래스)가 실행하는 모든 작업 메서드에 대해 실행되도록합니다. –

+0

자세히 보니, 고마워요 .--) – Steffen

2

세션 시작에 추가하십시오. 세션 손실이 발생하면 세션 시작도 트리거해야합니다. 다음과 같이 처리 할 수 ​​있습니다 :

protected void Session_Start(object src, EventArgs e) 
    { 
     if (Context.Session != null) 
     { 
      if (Context.Session.IsNewSession) 
      { 
       string sCookieHeader = Request.Headers["Cookie"]; 
       if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        // how to simulate it ??? 
        // RedirectToAction(“ActionName”, “ControllerName”, route values); 
        Response.Redirect("/Home/TestAction"); 
       } 

      } 
     } 


    } 
0

스티브가 언급 한 것에 동의하지만 모든 컨트롤러에 대한 기본 클래스를 만드는 대신 글로벌 필터를 사용하는 것이 좋습니다. 그 이유는 새 컨트롤러를 만들 때마다 항상 기본 컨트롤러에서 파생 된 것을 기억해야하거나 응용 프로그램에서 수 시간의 디버깅을 필요로하는 임의의 동작이 발생할 수 있기 때문입니다. 이는 개발을 잠시 중단 한 다음 다시 돌아올 때 특히 중요합니다.

또 다른 이유는 "상속에 우선 적용"원칙입니다.

관련 문제