El host remoto cerró la conexión. El código de error es 0x800704CD

81

Recibo correos electrónicos de error de mi sitio web cada vez que ocurre una excepción. Recibo este error:

El host remoto cerró la conexión. El código de error es 0x800704CD

y no sé por qué. Recibo alrededor de 30 al día. Tampoco puedo reproducir el error, por lo que no puedo localizar el problema.

El sitio web es ASP.NET 2 que se ejecuta en IIS7.

Seguimiento de pila:

en System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError (resultado Int32, booleano throwOnDisconnect) en System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush () en System.Web.HttpResponse.Flush (Boolean finalFlushse.Hesblushp. ) en System.Web.HttpResponse.End () en System.Web.UI.HttpResponseWrapper.System.Web.UI.IHttpResponse.End () en System.Web.UI.PageRequestManager.OnPageError (Remitente de objeto, EventArgs e) en .Web.UI.TemplateControl.OnError (EventArgs e) en System.Web.UI.Page.HandleError (Exception e) en System.Web.UI.Page.ProcessRequestMain (booleano includeStagesBeforeAsyncPoint, booleano includeStagesAfterAsyncPoint.UI) en System. Page.ProcessRequest (booleano includeStagesBeforeAsyncPoint, booleano includeStagesAfterAsyncPoint) en System.Web.UI.Page.ProcessRequest () en System.Web.UI.Page.ProcessRequestWithNoAssert (contexto HttpContext) en System.Web.UI.Page.ProcessRequest (contexto HttpContext) en ASP.default_aspx.ProcessRequest (contexto HttpContext) en System.Web.Application.HttpApplication.CallHandlerExecutionStep.Http IExecutionStep.Execute () en System.Web.HttpApplication.ExecuteStep (paso IExecutionStep, booleano y completadoSincrónicamente)

webnoob
fuente

Respuestas:

60

Consigo este todo el tiempo. Significa que el usuario comenzó a descargar un archivo y luego falló o lo canceló .

Para reproducir la excepción, intente hacerlo usted mismo; sin embargo, no conozco ninguna forma de evitarlo (excepto para manejar esta excepción específica solamente).

Debe decidir cuál es la mejor manera de avanzar en función de su aplicación.

m.edmondson
fuente
No ofrezco descargas de archivos en mi sitio. ¿La descarga de contenido de la página también lo causaría?
webnoob
7
Sí, mirar el seguimiento de la pila System.Web.HttpResponse.Flush()significa cualquier tipo de respuesta. Acabo de encontrar esto , puede ayudarlo a llegar a la ruta del problema donde viewstate es muy grande y los usuarios hacen clic demasiado rápido, lo que puede causar esta excepción.
m.edmondson
¿Sabes si esto produce un error al usuario o solo uno oculto?
webnoob
2
Mis propias investigaciones sobre esto muestran que los usuarios no ven nada fuera de lo común. ¿Ha tenido alguna queja de clientes / clientes?
m.edmondson
2
Ninguno. Gracias por la ayuda.
webnoob
30

Como mencionó m.edmondson , "El host remoto cerró la conexión". ocurre cuando un usuario o navegador cancela algo , o la conexión de red se interrumpe, etc. Sin embargo, no necesariamente tiene que ser una descarga de archivo, solo cualquier solicitud de cualquier recurso que resulte en una respuesta al cliente. Básicamente, el error significa que la respuesta no se pudo enviar porque el servidor ya no puede hablar con el cliente (navegador).

Hay una serie de pasos que puede tomar para evitar que suceda. Si está enviando manualmente algo en la respuesta con un Response.Write, Response.Flush, devolviendo datos de un método de página / servicio web o algo similar, entonces debería considerar verificar Response.IsClientConnected antes de enviar la respuesta. Además, si es probable que la respuesta tarde mucho tiempo o se requiera mucho procesamiento del lado del servidor, debe verificar esto periódicamente hasta que se llame a response.end. Consulte lo siguiente para obtener detalles sobre esta propiedad:

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.isclientconnected.aspx

Alternativamente, lo que creo que es más probable en su caso, el error es causado por algo dentro del marco. El siguiente enlace puede ser de utilidad:

http://blog.whitesites.com/fixing-The-remote-host-closed-the-connection-The-error-code-is-0x80070057__633882307305519259_blog.htm

La siguiente publicación de desbordamiento de pila también puede ser de interés:

"El host remoto cerró la conexión" en Response.OutputStream.Write

Sam Shiles
fuente
2
¡Grandes cosas para el Response.IsClientConnected!
Stumblor
10

Se puede reproducir el error con el siguiente código:

public ActionResult ClosingTheConnectionAction(){
   try
   {
      //we need to set buffer to false to
      //make sure data is written in chunks
      Response.Buffer = false;  
      var someText = "Some text here to make things happen ;-)";
      var content = GetBytes( someText );

      for(var i=0; i < 100; i++)
      {
         Response.OutputStream.Write(content, 0, content.Length);
      }

      return View();
   }
   catch(HttpException hex)
   {
      if (hex.Message.StartsWith("The remote host closed the connection. The error code is 0x800704CD."))
            {
                //react on remote host closed the connection exception.
                var msg = hex.Message;
            }  
   }
   catch(Exception somethingElseHappened)
   {
      //handle it with some other code
   }

   return View();
} 

Ahora ejecute el sitio web en modo de depuración. Coloque un punto de interrupción en el bucle que escribe en el flujo de salida. Vaya a ese método de acción y después de que pase la primera iteración cierre la pestaña del navegador. Presione F10 para continuar el bucle. Después de que llegue a la siguiente iteración, verá la excepción. Disfruta tu excepción :-)

Yaroslav Yakovlev
fuente
2

Recibí esto en un sitio asp.net 2.0 iis7 Windows2008. El mismo código en iis6 funcionó bien. Me estaba causando un problema porque estaba arruinando el proceso de inicio de sesión. El usuario iniciaría sesión y obtendría un 302 en default.asxp, que llegaría a través de page_load, pero no hasta el pre-renderizado antes de que iis7 enviara un 302 a login.aspx sin la cookie de autenticación. Comencé a jugar con la configuración del grupo de aplicaciones y, por alguna razón, 'habilitar aplicaciones de 32 bits' parece haberlo solucionado. No tengo idea de por qué, ya que este sitio no está haciendo nada especial que deba requerir controladores de 32 bits. Tenemos algunos sitios que todavía usan Access que requieren 32 bits, pero no nuestros sitios SQL directos como este.

Rich Wilson
fuente
la habilitación de aplicaciones de 32 bits me lo arregló también. Gracias !
Praneet Nadkar
Habilitar la aplicación de 32 bits puede resultar en que la aplicación utilice menos memoria, lo que puede indicar que hay un problema de memoria en el servidor. Esto también podría ser un problema completamente diferente.
jahu
2

Recibí este error cuando leí datos dinámicamente de a WebRequesty nunca cerré el Response.

    protected System.IO.Stream GetStream(string url)
    {
        try
        {
            System.IO.Stream stream = null;
            var request = System.Net.WebRequest.Create(url);
            var response = request.GetResponse();

            if (response != null) {
                stream = response.GetResponseStream();

                // I never closed the response thus resulting in the error
                response.Close(); 
            }
            response = null;
            request = null;

            return stream;
        }
        catch (Exception) { }
        return null;
    }
Clarice Bouwer
fuente
1

Yo también recibí este mismo error en mi controlador de imágenes que escribí. Lo conseguí como 30 veces al día en el sitio con mucho tráfico, logré reproducirlo también. Obtienes esto cuando un usuario cancela la solicitud (cierra la página o se interrumpe su conexión a internet por ejemplo), en mi caso en la siguiente fila:

myContext.Response.OutputStream.Write(buffer, 0, bytesRead);

No puedo pensar en ninguna forma de prevenirlo, pero tal vez puedas manejar esto adecuadamente. Ex:

        try
        {
            …
            myContext.Response.OutputStream.Write(buffer, 0, bytesRead);
            …
        }catch (HttpException ex)
        {
            if (ex.Message.StartsWith("The remote host closed the connection."))
                ;//do nothing
            else
                //handle other errors
        }            
        catch (Exception e)
        {
            //handle other errors
        }
        finally
        {//close streams etc..
        }
Robert Benyi
fuente
4
Esto falla miserablemente cuando la cultura del servidor no es el inglés (ya que el mensaje estaría en otro idioma). Simplemente use la ErrorCodepropiedad de la excepción (que debería ser igual a 2147943629, HRESULT 0x800704CD).
Ronald
4
Corrección: el ErrorCodepara HRESULT 0x800704CD es -2147023667.
Ronald
Nunca he usado una cultura de servidor que no sea en inglés, pero veo tu problema. No obstante, puede cambiar esa línea de código para manejar diferentes culturas de servidor, como la que sugirió
Robert Benyi