c# - new - "El host remoto cerró la conexión" en Response.OutputStream.Write
string to stream c# (4)
Este código transmite archivos grandes a nuestros usuarios:
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.Read);
// Total bytes to read:
dataToRead = iStream.Length;
// Read the bytes.
while (dataToRead > 0)
{
// Verify that the client is connected.
if (Response.IsClientConnected)
{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10000);
// Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, length);
// Flush the data to the HTML output.
Response.Flush();
buffer = new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
//prevent infinite loop if user disconnects
dataToRead = -1;
}
}
De vez en cuando recibimos esta excepción:
The remote host closed the connection. The error code is 0x80072746
Aquí está la traza de pila completa:
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 System.Web.HttpResponse.Flush(Boolean finalFlush)
at System.Web.HttpResponse.Flush()
at System.Web.HttpWriter.WriteFromStream(Byte[] data, Int32 offset, Int32 size)
at System.Web.HttpResponseStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at BIS.DocumentBus.Controls.DocumentViewer.StreamFile(String filepath)
Nunca hemos tenido evidencia de que los usuarios tengan problemas para descargar nuestros archivos y planean simplemente ignorar esta excepción.
¿Alguna idea de cuál es la fuente de este problema? ¿Es seguro ignorar?
Aumente executeTimeout en el elemento httpRuntime de web.config.
Si el usuario está descargando un archivo grande en una conexión lenta, la solicitud finalmente se agotará.
Esa excepción significa que el cliente que descarga el archivo rompió la conexión antes de que el archivo haya terminado de descargarse. es decir, el cliente navegó a otra página, o simplemente cerró el navegador.
Podría intentar mover la línea if (Response.IsClientConnected)
después de su iStream.Read
. Incluso si lo hiciste, creo que aún podría haber una posibilidad de recibir este error si la conexión se interrumpe mientras el método OutputStream.Write
sigue funcionando.
Estoy publicando esta respuesta porque podría ayudar a otros y ahorrar un tiempo importante.
En mi caso, Response.Buffer = true
en el método de descarga (en la primera declaración) resolvió el problema.
Gracias
Hay algunas causas posibles diferentes de esto. Puedo pensar en tres:
Una es llenar el búfer con cerca de 2GB de datos, pero este no debería ser el caso aquí, ya que se está vaciando regularmente.
Otra es precisamente la descrita en la respuesta que previamente aceptaste. Es muy difícil de reproducir, así que no asumiría que estaba necesariamente mal.
Otro caso posible, y en el que apostaría, es que se excede el tiempo de ejecución, lo que causaría una excepción ThreadAbortException al principio, pero esto a su vez podría provocar el fallo de Flush () que se convertiría en la excepción señalada.