내 Response.RedirectPermanent
콜백 후 내 코드 숨김 뒤에 return
문을 유지해야하는지 궁금합니다. 그것은 그 것처럼 보이지 않지만 다른 사람들과 확인하고 싶었습니다.ASP 코드 숨김에서 리디렉션 후에 return 키워드를 추가하면 어떤 이점이 있습니까?
Response.RedirectPermanent(vpd.VirtualPath);
return;
기능 또는 성능 향상을 위해 어떤 이유가 있습니까?
내 Response.RedirectPermanent
콜백 후 내 코드 숨김 뒤에 return
문을 유지해야하는지 궁금합니다. 그것은 그 것처럼 보이지 않지만 다른 사람들과 확인하고 싶었습니다.ASP 코드 숨김에서 리디렉션 후에 return 키워드를 추가하면 어떤 이점이 있습니까?
Response.RedirectPermanent(vpd.VirtualPath);
return;
기능 또는 성능 향상을 위해 어떤 이유가 있습니까?
답 신용 :
휴대 전화를 잡아라! 나의 이전 대답의 세부 사항은, 앞으로의 연구에 따르면, 전혀 사실이 아닙니다. 사실, 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
블록에서이를 방지하기위한 조치를 취하지 않는 한).
참고 : 리디렉션 할 때 사용자 데이터를 영원히 삭제하는 것은 버그가 아니기 때문입니다! >.> –
나는 시도 아래 코드 :
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
코드이후 코드가 실행되지 않으므로 리턴 또는 사용하지 않아도 동일한 효과가 나타납니다.
실제로 Response.Redirect는 페이지 실행을 중지하려고 시도합니다. 그러나, 그것은 항상 당신의 예제처럼 간단하지 않습니다. 내 대답 좀 봐. –
메소드의 마지막 문인'return; '이니? 아니면 건너 뛸 다른 코드가 있습니까? –