2012-02-01 18 views
10

Tengo una respuesta ASP de larga ejecución (en realidad una acción MVC) que quiero cancelar si el usuario se ha alejado. Creo que esto debería ser bastante simple:¿Cuándo se desacelera Response.IsClientConnected?

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

Sin embargo, me he encontrado con various sources partir that this method is slow.

Entonces me encontré con mis propias pruebas (usando MVC mini profiler, aunque se puede utilizar su propia):

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

que encontró que cada vez que llamo es consistentemente muy rápido: debajo de 1ms en configurar mi desarrollador. Esto es si es verdadero o falso.

¿En qué circunstancias se espera que Response.IsClientConnected sea lento?

Tengo que soportar IIS6 - ¿Sería Response.IsClientConnected más lento en eso?

¿Alguien sabe lo que está haciendo bajo las sábanas? En un nivel bajo, esperaría que la pila TCP/IP supiera si la conexión aún está allí, por lo que espero que esta verificación sea instantánea, pero ¿IIS tiene que hacer un trabajo adicional para verificar?

Respuesta

11

Buena pregunta, pero lamentablemente no tiene la respuesta, pero puede proporcionar la siguiente información. Con suerte, este puede ser un punto de partida para saber qué está haciendo debajo de las sábanas.

El Response.IsClientConnected está comprobando esto al preguntar al trabajador actual HttpWorkerRequest que maneja la solicitud.

La solicitud de trabajador puede ser de uno de los siguientes tipos y la crea el ISAPIWorkerRequest.CreateWorkerRequest(IntPtr ecb, bool useOOP) que es llamado por ISAPIRuntime.ProcessRequest(IntPtr ecb, int iWRType). Este es el punto de entrada del ISAPI de bajo nivel al tiempo de ejecución de ASP.NET.

  1. ISAPIWorkerRequestInProcForIIS6
  2. ISAPIWorkerRequestInProcForIIS7> = IIS7
  3. ISAPIWorkerRequestInProc < IIS6
  4. ISAPIWorkerRequestOutOfProc Porque de proc solicita

Para todos los trabajadores del InProc HttpWorkerRequest esta llamada se dirige de nuevo a código no administrado llamando al int EcbIsClientConnected(IntPtr pECB) que se encuentra en el webengine.dllpECB siendo el Bloque de Control de Extensión (ECB), proporciona todo el acceso de bajo nivel a la solicitud de ISAPI. Esta referencia se pasa inicialmente al ISAPIRuntime.ProcessRequest.

Ahora no puedo encontrar ningún detalle de implementación del método EcbIsClientConnected. Así que sin esto es imposible saber qué está haciendo debajo de las coberturas y cómo esto puede diferir para las diferentes versiones de IIS. ¿Tal vez alguien más puede explicar esto? Me gustaría saber también.

+0

Genial, es un buen comienzo, pero no la respuesta. Lo votaré una vez que tenga uno. – Keith

+0

Acabo de solicitar los detalles de implementación del método EcbIsClientConnected en los foros de IIS.NET. Espero que alguien allí lo sepa - http://forums.iis.net/t/1187030.aspx –

+0

Saludos, aunque parece que la respuesta es "¡no te metas con eso!" Útil: - | – Keith

Cuestiones relacionadas