2012-02-01 16 views
10

Kullanıcının gezinip gitmediğini iptal etmek istediğim uzun süren bir ASP yanıtı (aslında bir MVC eylemi) var. Bunun oldukça basit olması gerektiğini düşünüyorum: Response.IsClientConnected ne zaman yavaş çalışıyor?

if(!this.Response.IsClientConnected) 
{ 
    Response.End(); 
} 

Ancak various sources that this method is slow başlayan rastladım.

Yani (kendi kullanabilirsiniz olsa MVC mini profiler kullanarak) kendi testler yaptık: 1ms altında benim geliştirici kurmak üzerine: Ben her aradığınızda çok hızlı tutarlı olduğunu tespit

using (var step = MiniProfiler.Current.Step("Response_IsClientConnected")) 
if(!this.Response.IsClientConnected) 
{ 
    Response.End(); 
} 

. Bu doğru ya da yanlış olup olmadığıdır.

Hangi koşullarda Response.IsClientConnected yavaş olması bekleniyor?

IIS6'yı desteklemem gerekir - Response.IsClientConnected daha yavaş olur mu?

Kapakların altında ne yaptığını bilen var mı? Düşük düzeyde, TCP/IP yığınının bağlantının hala devam edip etmediğini bilmesini beklerdim, bu yüzden bu kontrolün anında gerçekleşmesini beklerdim, ancak IIS'nin kontrol etmek için bazı ek çalışmalar yapması gerekiyor mu?

cevap

11

İyi bir soru ama maalesef cevabımız yok, ancak aşağıdaki bilgileri sağlayabilir. Umarım bu, kapakların altında ne yaptığını bilmek için bir başlangıç ​​noktası olabilir.

Response.IsClientConnected, geçerli çalışan HttpWorkerRequest isteğini kullanarak bunu denetleyerek bunu denetliyor.

İşçi isteği aşağıdaki türlerden biri olabilir ve ISAPIRuntime.ProcessRequest(IntPtr ecb, int iWRType) tarafından çağrılan ISAPIWorkerRequest.CreateWorkerRequest(IntPtr ecb, bool useOOP) tarafından oluşturulur. Bu, düşük düzey ISAPI'den ASP.NET çalışma süresine giriş noktasıdır.

  1. ISAPIWorkerRequestInProcForIIS6
  2. proc kaybedilmesi durumunda
  3. ISAPIWorkerRequestInProcForIIS7> = IIS7
  4. ISAPIWorkerRequestInProc < IIS6
  5. ISAPIWorkerRequestOutOfProc bu çağrı daha sonra yönetilmeyen koda geri yönlendirilir tüm ınproc HttpWorkerRequest işçiler için

istekleri webengine.dlladresinde bulunan int EcbIsClientConnected(IntPtr pECB) numaralı telefonu arayarak Uzatma Kontrol Bloğu (ECB) olan, ISAPI isteğine tüm düşük seviye erişim sağlar. Bu referans başlangıçta ISAPIRuntime.ProcessRequest'a iletilmiştir.

Artık EcbIsClientConnected yönteminin uygulama ayrıntılarını bulamıyorum. Yani bu olmadan, kapakların altında ne yaptığını ve bunun farklı IIS sürümleri için nasıl farklı olabileceğini bilmek imkansız. Belki başka biri bunu açıklayabilir mi? En iyi şekilde bilmek isterim.

+0

Harika, bu iyi bir başlangıç, ama cevap değil. Bir kez sahip olduğumda oy kullanacağım. – Keith

+0

Sadece IIS.NET forumlarındaki EcbIsClientConnected yönteminin uygulama ayrıntılarını sordum. Umarım birisi bilir - http://forums.iis.net/t/1187030.aspx –

+0

Şerefe, yanıtın "bununla karışma!" Faydalı: - | – Keith

İlgili konular