Yanıt.() End zararlı olarak kabul edilir?
This KB Article ASP.NET's Response.End()
bir iş parçacığı iptal diyor.
Reflektör bu gibi görünüyor olduğunu göstermektedir:
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 oldukça sert görünüyor. KB makale dediği gibi, Response.End()
aşağıdaki uygulama herhangi bir kod çalıştırılmaz ve en az şaşkınlık ilkesini ihlal ediyor. Neredeyse bir Win app Application.Exit()
gibi. İş parçacığı iptal hariç Response.End()
neden deÄŸil catchable, try
...finally
bir kod çevreleyen tatmin etmez.
Beni her zaman Response.End()
Kaçınılması gerektiğini merak ediyor.
HttpContext.Current.ApplicationInstance.CompleteRequest()
kim ne zaman, ne zaman Response.Close()
Response.End()
, kullanmalı mıyım önerir misiniz?
ilan No: Rick Strahl's blog entry.
Aldığım verilere göre, cevabımEvet, Response.End
zararlı olabilirbazı durumlarda yararlıdır , ama.
- derhal olağanüstü koşullar
HttpResponse
sonlandırma atmak için bir yakalanamayacak gibiResponse.End()
kullanın. Ayrıca hata ayıklama sırasında yararlı olabilir.Response.End()
rutin yanıtları tamamlamak için kaçının. Response.Close()
hemen müşteri ile bağlantıyı kapatmak için kullanın. this MSDN blog post bu yöntem başınanormal bir HTTP isteği işlemek için tasarlanmamıştır.Bu yöntemi çağırmak için iyi bir sebep olması ihtimali çok yüksek.CompleteRequest()
normal bir istek sonuna kadar kullanın.CompleteRequest
ASP.NET boru hattı öndeEndRequest
olay atlamak neden olur, ** 20 geçerli olay tamamlandıktan sonra.CompleteRequest
o zaman cevap için bir şey daha yazmak aradığınızda, müşteri gönderilecek yazıyorum.
- 13 Nisan 2011 Düzenleyin
Daha fazla açıklık için:
- Useful post on MSDN Blog
- Useful analysis by Jon Reid
CEVAP
TL;DR
Başlangıçta sadece aramalarınız tüm değiştirmeniz gerektiğini tavsiye etti [Yanıt.Son] ile [...] CompleteRequest() eğer kaçınmak istiyorsanız çağırır, ama geri gönderme işleme ve html eklemek gerekir işleme [...] geçersiz kılar iyi.
Jon Reid, "Son Tahlilde"
Başına MSDN, Jon Reid ve Winton Alain:
ASP.NET Performance - Exception Management - Write Code That Avoids Exceptions
Sunucu.Transfer, Yanıt.Yönlendirme, Tepki.Son büyütmek yöntemleri özel durumlar. Bu yöntemlerin her biri içten Yanıt arayın.Sonunda. Çağrı Yanıt.Sırayla causes a ThreadAbortException exception End.
ThreadAbortException Solution
HttpApplication.() CompleteRequest iş parçacığının neden olan bir değişken ayarlar HttpApplication olay ardışık olaylar [--] en son atla Sayfa olay ama Uygulama olay zincir zincir.
...
sınıf düzeyi Sayfanın bayrakları sonlandırın ve sonra değişken oluştur değişken olayları işleme veya sayfa oluşturma önce kontrol edin. [...] Sadece overriding the RaisePostBackEvent and Render methods tavsiye ederim
Yanıt.Son ve Cevabı.Yakın normal bir istek işleme kullanılmaz zaman vardır performans önemli. Yanıt.Sonunda, ağır elli kullanışlı bir araçtır sonlandırıcı ilişkili bir performans cezası ile işleme isteği. Yanıt.Yakın IIS/soket HTTP yanıtı hemen sona erdirilmesi için canlı tutma gibi şeylerle düzeyi ve nedenleri konularında.
ASP.NET bir istek biten önerilen yöntemdir HttpApplication.CompleteRequest. ASP.NET render olacak unutmayın için el ile HttpApplication beri atlanır.CompleteRequest kalan atlar IIS/ASP.Uygulama boru hattı, ASP.NET Sayfa boru değil NET olan uygulama boru hattı birinci aşama).
Kod
Bence en iyi Copyright © 2001-2007, C6 Software, Inc.
BaÅŸvuru
HttpApplication.CompleteRequest
Neden tüm olayları atlayıp HTTP boru hattı zincirinde filtreleme ASP.NET yürütme ve doğrudan EndRequest olay yürütmek.
Response.End
Bu yöntemASP ile sadece uyumluluk için sağlanan—Bu, için. COM tabanlı ile uyumluluk Web-Programlama öncesinde teknoloji ASP.NET.ASP.NET öncesinde. [Vurgu eklenmiştir]
Response.Close
Bu yöntem, ani bir şekilde istemci bağlantıyı sonlandırır ve normal bir HTTP isteği işlemek için tasarlanmamıştır. [Vurgu eklenmiştir]
Neden SELECT * zararlı olarak kabul ed...
Neden döngüsel başvurular zararlı olar...
Boost zararlı olarak kabul edilir?...
Neden Java Vector sınıfı eski veya kul...
Neden statik bir yöntem olarak kabul e...