SORU
6 Temmuz 2009, PAZARTESİ


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 gibi Response.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ı önde EndRequest 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
12 EKİM 2010, Salı


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]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • Moto Journal

    Moto Journal

    28 Mayıs 2007