2010-04-16 4 views
20

Mi aplicación web debe procesar y servir una gran cantidad de datos para mostrar ciertas páginas. A veces, el usuario cierra o actualiza una página mientras el servidor todavía está ocupado procesándola. Esto significa que el servidor continuará procesando los datos durante varios minutos solo para enviarlos a un cliente que ya no está escuchando.¿Puede un servidor http detectar que un cliente ha cancelado su solicitud?

¿Es posible detectar que la conexión se ha roto y reaccionar a ella?

En este proyecto en particular, estamos usando Django y NginX, o Apache. Supuse que esto es posible porque el servidor de desarrollo de Django parece reaccionar a solicitudes canceladas imprimiendo excepciones de Broken Pipe. Me encantaría que hiciera una excepción que el código de mi aplicación pudiera detectar. It appears JSP can do this. So can node.jshere.

Como alternativa, podría registrar un controlador de eventos de descarga en la página en cuestión, hacer un XHR sincrónico solicitando que se cancele la solicitud anterior de este usuario, y hacer algún tipo de comunicación entre procesos para hacerlo. Quizás si el procesamiento de datos más lento se transfirió a otro proceso que podría identificar y matar más fácilmente, sin matar el proceso de respuesta ...

Respuesta

0

HTTP es sin estado, por lo tanto, la única forma de detectar un cliente desconectado es a través de tiempos de espera.

Ver las respuestas a this Pregunta AS (Java Servlet: ¿Cómo detectar el cierre del navegador?).

+0

Creo que la palabra correcta es sin conexión, :) – jerjer

+0

@jerjer - Gracias por la corrección :) – Oded

+0

Parece extraño, ya que TCP debería poder hacer esto. Supongo que algunas cosas se pierden en la abstracción. –

9

Mientras @Oded es correcto que HTTP es sin estado entre solicitudes, los servidores de aplicación puede en efecto detectar cuando la conexión TCP/IP subyacente ha roto para la solicitud siendo procesado. ¿Por qué es esto? Porque TCP es un protocolo con estado para conexiones confiables.

Una técnica común para las aplicaciones web .Net que procesan una solicitud de recursos intensivos es marcar Response.IsClientConnected (docs) antes de comenzar el trabajo de uso intensivo de recursos. No tiene sentido perder ciclos de CPU para enviar una respuesta costosa a un cliente que ya no está allí.

private void Page_Load(object sender, EventArgs e) 
{ 
    // Check whether the browser remains 
    // connected to the server. 
    if (Response.IsClientConnected) 
    { 
     // If still connected, do work 
     DoWork(); 
    } 
    else 
    { 
     // If the browser is not connected 
     // stop all response processing. 
     Response.End(); 
    } 
} 

Responda con su pila de servidor de aplicaciones objetivo para que pueda dar un ejemplo más relevante.

En cuanto a su segunda alternativa para usar XHR para publicar eventos de descarga de página de cliente en el servidor, el comentario de @Oded sobre que HTTP es sin estado entre las solicitudes es perfecto. Es poco probable que esto funcione, especialmente en una granja con varios servidores.

Cuestiones relacionadas