이 KB 기사 는 ASP.NET이Response.End() 이 스레드를 중단 .
리플렉터는 다음과 같이 보입니다.
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
이것은 나에게 매우 가혹한 것 같습니다. KB 기사에서 알 수 있듯이 다음 앱의 코드는 Response.End()실행되지 않으며 놀랍게도 최소화하는 원칙을 위반합니다. Application.Exit()WinForms 앱 과 거의 같습니다 . 에 의한 스레드 중단 예외 Response.End()는 포착 할 수 없으므로 코드를 둘러싼 try... finally만족하지 않습니다.
항상 피해야하는지 궁금합니다 Response.End().
Response.End()언제 Response.Close(), 언제 , 언제 사용해야하는지 제안 할 수 있습니까 HttpContext.Current.ApplicationInstance.CompleteRequest()?
ref : Rick Strahl의 블로그 항목 .
내가받은 입력을 기반으로 내 대답은 예 Response.End입니다. 유해 하지만 일부 경우에 유용합니다.
- 예외적 인 상황에서
Response.End()즉시 종료하려면 잡을 수없는 던지기로 사용하십시오HttpResponse. 디버깅 중에도 유용 할 수 있습니다. 일상적인 반응을 피하십시오Response.End(). Response.Close()클라이언트와의 연결을 즉시 닫는 데 사용 합니다. 당 이 MSDN 블로그 게시물 이 방법은 보통의 HTTP 요청을 처리하기위한 것이 아닙니다. 이 메소드를 호출 할만한 이유가있을 가능성은 거의 없습니다.CompleteRequest()정상적인 요청을 끝내는 데 사용 합니다. 현재 이벤트가 완료된 후CompleteRequestASP.NET 파이프 라인이 이벤트로 이동합니다. 따라서 호출 한 다음 응답에 더 많은 것을 쓰면 쓰기가 클라이언트로 전송됩니다.EndRequestHttpApplicationCompleteRequest
편집-2011 년 4 월 13 일
또한 선명도는 여기에 있습니다 :
- MSDN 블로그에 유용한 포스트
- 존 리드하여 유용한 분석
Response.Redirect와 Server.Transfer모두 전화 Response.End와도 피해야한다.
Response.EndThreadAbortException있습니다.