2011-04-15 24 views
8

estoy constantemente conseguir la siguiente excepción que es causada por un usuario iniciar una descarga, y que en consecuencia no (o se cancele):forma aceptada para prevenir "El host remoto cerró la conexión" excepción

Error Message : The remote host closed the connection. The error code is 0x80072746. Stack Trace : at System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6.FlushCore(Byte[] status, Byte[] header, Int32 keepConnected, Int32 totalBodySize, Int32 numBodyFragments, IntPtr[] bodyFragments, Int32[] bodyFragmentLengths, Int32 doneWithSession, Int32 finalStatus, Boolean& async) at System.Web.Hosting.ISAPIWorkerRequest.FlushCachedResponse(Boolean isFinal) at System.Web.Hosting.ISAPIWorkerRequest.FlushResponse(Boolean finalFlush) at

He buscado en todo el Internet, and found an interesting article, sin embargo, no parece haber una respuesta definitiva como la mejor manera de evitar que esto llene los registros.

El usuario no ve ningún error y no hay ningún problema real en la aplicación, ya que ocurre solo (a mi entender) en situaciones fuera de su control (usuario cancelando descarga o pérdida de conexión) pero tiene que haber una forma de prevenir tal excepción se informa.

Odio decirlo pero estoy tentado de comprobar que esta excepción y la captura vacía bloqueen su trasero, pero esto me hace sentir como un programador sucio.

So - ¿Cuál es el método aceptado para evitar que esta excepción llene mi buzón?

+0

¿Necesita explicar cómo inicia el usuario la descarga? ¿Es navegador? ¿Está en AJAX? ... – Aliostad

+0

@ m.edmondson - Si ocurre una excepción, entonces necesita atraparla o ajustar su configuración para NO enviarle un correo electrónico cada vez que ocurra esta excepción. Una descarga que no termina no debería causar esto. –

+0

Se inicia a través de 'System.Web.HttpResponse.TransmitFile()' –

Respuesta

2

No se puede evitar que un host remoto cierre algo.

Y en algunos protocolos esta es la manera normal (o al menos aceptada) de decir adiós.

Así que tendrá que manejar esta excepción específica.

+0

Entiendo que - Quiero el mejor/aceptado/el método más adecuado para hacerlo –

+2

En este raro caso, un bloque de captura vacío es aceptable . Rellene con un gran comentario por qué está vacío. –

+2

Me gustaría destacar la parte ** this ** de la última línea. No solo atrape() o atrape (Excepción e), capte su excepción específica y permita que otros se burlen del usuario a menos que pueda hacer algo al respecto. – BenCr

1

Desde una perspectiva práctica, no hay nada de malo en cancelar una descarga en virtud de una computadora muerta o una sesión web muerta, por lo tanto, la captura de excepciones de host remoto cerrado es perfectamente aceptable.

+1

Entonces, ¿cuál sería la mejor manera de asegurar que "yo solo" atrape esto? Verifique el mensaje de excepción? –

+0

¿Qué le dice el mensaje que la excepción real no lo hace? Atrapar la excepción (puede deberse a múltiples razones, pero el efecto subyacente no cambia) – Petesh

6

El error ocurre cuando intenta enviar una respuesta al cliente pero se han desconectado. Puede verificar esto estableciendo un punto de interrupción en Response.Redirect o donde esté enviando datos al cliente, espere a que Visual Studio llegue al punto de interrupción y luego cancele la solicitud en IE (usando la x en la barra de ubicación). Esto debería provocar el error.

Para capturar el error que se puede utilizar el siguiente:

try 
{ 
    Response.Redirect("~/SomePage.aspx"); 
    Response.End(); 
} 
catch (System.Threading.ThreadAbortException) 
{ 
    // Do nothing. This will happen normally after the redirect. 
} 
catch (System.Web.HttpException ex) 
{ 
    if (ex.ErrorCode == unchecked((int)0x80070057)) //Error Code = -2147024809 
    { 
     // Do nothing. This will happen if browser closes connection. 
    } 
    else 
    { 
     throw ex; 
    } 
} 

O en C# 6, se pueden utilizar filtros de excepción para evitar tener que volver a tirar el error:

try 
{ 
    Response.Redirect("~/SomePage.aspx"); 
    Response.End(); 
} 
catch (System.Threading.ThreadAbortException) 
{ 
    // Do nothing. This will happen normally after the redirect. 
} 
catch (System.Web.HttpException ex) when (ex.ErrorCode == unchecked((int)0x80070057)) 
{ 
    // Do nothing. This will happen if browser closes connection. 
} 

que es una mejor la experiencia de depuración ya que se detendrá en la declaración arrojando la excepción con el estado actual y todas las variables locales conservadas en lugar de en el tiro dentro del bloque catch.

Cuestiones relacionadas