2012-02-01 18 views
10

Mam długo działającą odpowiedź ASP (w rzeczywistości działanie MVC), którą chcę anulować, jeśli użytkownik odszedł. Myślę, że to powinno być dość prosta:Kiedy usługa Response.IsClientConnected jest wolna?

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

Jednak Natknąłem various sources począwszy that this method is slow.

Więc wpadłem własne testy (używając MVC mini profiler, choć można użyć własnych):

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

To okazało się, że za każdym razem ja to nazywam to konsekwentnie bardzo szybko: poniżej 1ms na mój deweloper skonfigurować. To jest, czy jest to prawda czy fałsz.

W jakich okolicznościach oczekuje się, że powolny będzie Response.IsClientConnected?

Muszę obsługiwać IIS6 - czy wolałbym na tym Response.IsClientConnected?

Czy ktoś wie, co robi pod kołdrą? Na niskim poziomie oczekiwałbym, że stos TCP/IP dowie się, czy połączenie jest nadal dostępne, więc spodziewam się, że ta kontrola będzie natychmiastowa, ale czy usługi IIS muszą wykonać dodatkową pracę, aby to sprawdzić?

Odpowiedz

11

Dobre pytanie, ale niestety nie ma odpowiedzi, ale może podać następujące informacje. Mam nadzieję, że to może być punkt wyjścia do poznania, co robi pod osłonami.

Sprawdza to Response.IsClientConnected, prosząc obecnego pracownika HttpWorkerRequest o obsługę żądania.

Żądanie dla pracowników może być jednym z poniższych typów i jest tworzone przez ISAPIWorkerRequest.CreateWorkerRequest(IntPtr ecb, bool useOOP), które jest wywoływane przez ISAPIRuntime.ProcessRequest(IntPtr ecb, int iWRType). Jest to punkt wejścia od ISAPI niskiego poziomu do środowiska wykonawczego ASP.NET.

  1. ISAPIWorkerRequestInProcForIIS6
  2. ISAPIWorkerRequestInProcForIIS7> = IIS7
  3. ISAPIWorkerRequestInProc < IIS6
  4. ISAPIWorkerRequestOutOfProc Albowiem z proc żąda

dla wszystkich InProc HttpWorkerRequest pracowników to połączenie jest następnie kierowane z powrotem do kodu niezarządzanego dzwoniąc pod numer int EcbIsClientConnected(IntPtr pECB), który znajduje się pod numerem webengine.dllpECB, będący blokiem rozszerzenia rozszerzeń (ECB), zapewnia dostęp niskiego poziomu do żądania ISAPI. To odniesienie jest początkowo przekazywane do ISAPIRuntime.ProcessRequest.

Teraz nie mogę znaleźć żadnych szczegółów dotyczących implementacji metody EcbIsClientConnected. Więc bez tego nie można wiedzieć, co robi pod osłonami i jak to może być różne w różnych wersjach IIS. Może ktoś inny może to wyjaśnić? Chciałbym również wiedzieć.

+0

Fajnie, to dobry początek, ale nie odpowiedź. Wezmę to głos, gdy już go mam. – Keith

+0

Właśnie poprosiłem o szczegóły implementacji metody EcbIsClientConnected na forach IIS.NET. Mam nadzieję, że ktoś tam wie - http://forums.iis.net/t/1187030.aspx –

+0

Wiwaty, chociaż wygląda na to, że odpowiedź brzmi: "nie zadzieraj z tym!" Pomocne: - | – Keith

Powiązane problemy