2012-02-01 14 views
10

Ho una risposta ASP di lunga durata (in realtà un'azione MVC) che desidero annullare se l'utente ha navigato. Penso che questo dovrebbe essere abbastanza semplice:Quando è Response.IsClientConnected lento?

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

Tuttavia ho incontrato various sources partire that this method is slow.

Così ho eseguito i miei test (utilizzando MVC mini profiler, anche se si potrebbe utilizzare il proprio):

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

che ha trovato che ogni volta che lo chiamo io è sempre molto veloce: in 1ms sul mio sviluppatore istituito. Questo è se è vero o falso.

In quali circostanze è previsto che Response.IsClientConnected sia lento?

Devo supportare IIS6 - Response.IsClientConnected dovrebbe essere più lento?

Qualcuno sa cosa sta facendo sotto le coperte? A un livello basso mi aspetterei che lo stack TCP/IP sappia se la connessione è ancora presente, quindi mi aspetto che questo controllo sia istantaneo, ma IIS deve fare qualche altro lavoro da controllare?

risposta

11

Buona domanda, ma sfortunatamente non ho la risposta, ma in grado di fornire le seguenti informazioni. Speriamo che questo possa essere un punto di partenza per sapere cosa sta facendo sotto le coperte.

Il Response.IsClientConnected sta verificando ciò chiedendo al lavoratore attuale HttpWorkerRequest di gestire la richiesta.

La richiesta di lavoro può essere uno dei seguenti tipi e viene creata dallo ISAPIWorkerRequest.CreateWorkerRequest(IntPtr ecb, bool useOOP) che viene chiamato dallo ISAPIRuntime.ProcessRequest(IntPtr ecb, int iWRType). Questo è il punto di ingresso dal livello basso ISAPI al runtime ASP.NET.

  1. ISAPIWorkerRequestInProcForIIS6
  2. ISAPIWorkerRequestInProcForIIS7> = IIS7
  3. ISAPIWorkerRequestInProc < IIS6
  4. ISAPIWorkerRequestOutOfProc Poiché da proc richiede

per tutti i InProc HttpWorkerRequest lavoratori questa chiamata viene poi reindirizzato al codice non gestito chiamando lo int EcbIsClientConnected(IntPtr pECB) che si trova nello webengine.dllpECB essendo l'Extension Control Block (ECB), fornisce tutto l'accesso di basso livello alla richiesta ISAPI. Questo riferimento è inizialmente passato allo ISAPIRuntime.ProcessRequest.

Ora non riesco a trovare dettagli di implementazione del metodo EcbIsClientConnected. Quindi senza questo è impossibile sapere cosa sta facendo sotto le copertine e come questo potrebbe essere diverso per le diverse versioni di IIS. Forse qualcun altro può spiegarlo? Mi piacerebbe saperlo anche io.

+0

Cool, questo è un buon inizio, ma non la risposta. Lo voterò una volta che ne avrò uno. – Keith

+0

Ho appena chiesto i dettagli di implementazione del metodo EcbIsClientConnected sui forum IIS.NET. Spero che qualcuno sappia - http://forums.iis.net/t/1187030.aspx –

+0

Cheers, anche se sembra che la risposta sia "non scherzare!" Utile: - | – Keith