2013-04-27 5 views
4

Response.RedirectPermanent 콜백 후 내 코드 숨김 뒤에 return 문을 유지해야하는지 궁금합니다. 그것은 그 것처럼 보이지 않지만 다른 사람들과 확인하고 싶었습니다.ASP 코드 숨김에서 리디렉션 후에 return 키워드를 추가하면 어떤 이점이 있습니까?

Response.RedirectPermanent(vpd.VirtualPath); 
return; 

기능 또는 성능 향상을 위해 어떤 이유가 있습니까?

+0

메소드의 마지막 문인'return; '이니? 아니면 건너 뛸 다른 코드가 있습니까? –

답변

4

답 신용 :

휴대 전화를 잡아라! 나의 이전 대답의 세부 사항은, 앞으로의 연구에 따르면, 전혀 사실이 아닙니다. 사실, MSDN 설명서는 다음을 지정

당신이 CompleteRequest를 호출 한 후 한 페이지에 대한 요청을 종료하고 거짓에 또 다른 페이지에 대한 새로운 요청, 설정 endResponse를 시작하고 페이지 처리기에서이 방법을 사용하는 경우 방법. endResponse 매개 변수에 true를 지정하면이 메소드는 원래 요청에 대해 End 메소드를 호출합니다.이 메소드는 완료시 ThreadAbortException 예외를 발생시킵니다. 이 예외는 웹 응용 프로그램 성능에 해로운 영향을 미치므로 endResponse 매개 변수에 false를 전달하는 것이 좋습니다.

http://msdn.microsoft.com/en-GB/library/a8wa7sdt.aspx

그래서, 실제 사실, 페이지의 나머지 부분은 (이론적으로 -이 이상 떨어질 때의 예를 들어 아래의 '업데이트'를 참조) 실행 하지이다; 그러나 현재의 스레드 처리를 종료하는 데 상대적으로 비용이 많이 드는 방법 인 ThreadAbortException을 던져서 endResponse 메커니즘을 구현한다는 점에서 현재와 마찬가지로 매우 실체적인 문제가 있습니다.

대신, 스레드가 계속하자하도록 지시해야하지만, 즉시 반환 - 또한 그들이해야 무엇을 호출 스택에서 다른 방법이하고있는 것을 확인 :

Response.RedirectPermanent(vpd.VirtualPath, false); 
return; 

더 나은 아직,에 전화를 포장 조건은 바람직하지 않은 코드가 호출되지 않도록하고 (현재 실행중인 코드를 종료하지 않고 모든 후속 이벤트를 무시합니다)에 CompleteRequest 방법 사용 :

if (_redirecting) 
{ 
    Response.RedirectPermanent(vpd.VirtualPath, false); 
    Context.ApplicationInstance.CompleteRequest(); 
} 
else 
{ 
    /* Code I don't want to execute if I do a redirect */ 
    DeleteUsersDataForever(_currentUser); 
} 

에 대한 심도있는 기사가있다을 이 아주 주제 here 그리고 설명서 자체도 인 것 같습니다. Response.Redirect이 응답을 종료하도록 허용하면 호출됩니다.

업데이트 :

try 
{ 
    // Redirect and terminate execution 
    Response.Redirect(someUrl, true); 
} 
catch 
{ 
    // Handle some errors. 
} 

DeleteUsersDataForever(_currentUser); 

예외 Response.End에 의해 제기 된 것 :는 또한, 스레드가 예외를 발생하여 종료 주어진, 당신이 시도 및 시도/캐치 내부에 리디렉션을 수행 할 경우 발생하는 고려 캐치 블록에 이 걸렸습니다. 따라서 나머지 코드는 여전히 실행 중이며 _currentUser의 데이터를 실수로 모두 삭제했습니다 (발신자에게 예외를 버블 링하는 등 catch 블록에서이를 방지하기위한 조치를 취하지 않는 한).

+0

참고 : 리디렉션 할 때 사용자 데이터를 영원히 삭제하는 것은 버그가 아니기 때문입니다! >.> –

2

나는 시도 아래 코드 :

Page1.aspx라는

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.RedirectPermanent("~/Page2.aspx"); 
    Session["afterRedirect"] = "after redirect"; 
} 

Page2.aspx

protected void Page_Load(object sender, EventArgs e) 
{  
    Response.Write(Session["afterRedirect"] ?? "nothing to show"); 
} 

결과

,536,

nothing to show

코드이후 코드가 실행되지 않으므로 리턴 또는 사용하지 않아도 동일한 효과가 나타납니다.

+0

실제로 Response.Redirect는 페이지 실행을 중지하려고 시도합니다. 그러나, 그것은 항상 당신의 예제처럼 간단하지 않습니다. 내 대답 좀 봐. –