Bu KB makalesi , ASP.NET'in Response.End()bir iş parçacığını iptal ettiğini söylüyor .
Reflektör, şuna benzediğini gösterir:
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();
}
}
}
Bu bana çok sert geliyor. KB makalesinde belirtildiği gibi, aşağıdaki uygulamada herhangi bir kod Response.End()yürütülmez ve bu en az şaşkınlık ilkesini ihlal eder. Neredeyse Application.Exit()bir WinForms uygulamasında olduğu gibi. Neden olduğu iş parçacığı iptali istisnası Response.End()catchable değildir, bu yüzden kodu çevreleyen try... finallytatmin olmaz.
Her zaman kaçınmam gerekip gerekmediğini merak ediyor Response.End().
Kullanmalıyım zaman kimse, önerebilir Response.End()zaman Response.Close()ve ne zaman HttpContext.Current.ApplicationInstance.CompleteRequest()?
ref: Rick Strahl'in blog girişi .
Aldığım girdiye dayanarak, cevabım, Evet, Response.Endzararlıdır , ancak bazı sınırlı durumlarda yararlıdır.
- İstisnai koşullarda
Response.End()derhal feshetmek için erişilemez bir atış olarak kullanınHttpResponse. Hata ayıklama sırasında da yararlı olabilir. Rutin yanıtları tamamlamaktan kaçınınResponse.End(). Response.Close()istemciyle bağlantıyı hemen kapatmak için kullanın . Başına bu MSDN blog yayınında , bu yöntem , normal HTTP isteği işleme için tasarlanmamıştır. Bu yöntemi çağırmak için iyi bir nedeninizin olması pek olası değildir.CompleteRequest()normal bir isteği sonlandırmak için kullanın . geçerli olay tamamlandıktan sonraCompleteRequestASP.NET ardışık düzenininEndRequestolaya atlamasını sağlarHttpApplication. Eğer ararsanızCompleteRequest, daha sonra yanıta bir şey daha yazın, yazma istemciye gönderilir.
Düzenle - 13 Nisan 2011
Daha fazla netlik burada bulabilirsiniz:
- MSDN Blog yararlı yazı
- Jon Reid tarafından yararlı analiz
Response.Redirectve Server.Transferher ikisi de çağırır Response.Endve kaçınılmalıdır.
Response.EndThreadAbortExceptiongayet iyi yakalıyorum .