c# - net - requestfiltering web config
HttpContext lanza HttpException (7)
¿Qué .NET Framework estás usando? Este hilo del foro here describe un problema similar al usar IIS7 con .NET2.0 específicamente para hacer con la desconexión del cliente, un problema que se resolvió en .NET framework 3.5
El código de error real se asigna a
0x800703E3 "The I/O operation has been aborted because of either a thread exit or an application request."
He escrito un controlador de http personalizado. Lo he hecho escribiendo una clase que implementa el IHttphandler.
Dentro de esa clase tengo código como este,
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.AddHeader("Content-Disposition", "attachment;filename=" + attachmentFileName);
context.Response.AddHeader("Content-Length", new FileInfo(downloadFile).Length.ToString());
context.Response.ContentType = GetMimeType(attachmentFileName);
context.Response.TransmitFile(downloadFile);
context.Response.Flush();
context.Response.Close();
De vez en cuando recibo un error como este,
Exception HttpException The remote host closed the connection The error code is 0x800703E3
O esto,
Exception HttpException The remote host closed the connection The error code is 0x80070040
En ambos casos la traza de pila es esta,
at System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(Int32 result, Boolean throwOnDisconnect)
at System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()
at System.Web.HttpResponse.Flush(Boolean finalFlush)
at System.Web.HttpResponse.Flush()
Esto ocurre en la producción, y si miro hacia atrás en los últimos días, los errores han ocurrido 23 veces y, en total, el código anterior ha sido llamado 497 veces.
Sospecho que esta falla se relaciona con el usuario que hace clic en el enlace para iniciar el código anterior más de una vez (lo que les dará múltiples cuadros de diálogo de descarga) y luego cancelan algunos de ellos. Habiendo dicho que si fuera algo así, habría esperado que la conexión se cerrara con gracia en ambos extremos.
¿Cómo puedo probar la causa exacta de este error? He intentado habilitar el seguimiento de .NET como este. ¿Por qué no rastrear a los oyentes para registrar el tráfico del controlador personalizado? pero no podía hacerlo funcionar.
Lo que encontré, sin embargo, es que he habilitado el seguimiento de IIS para registrar las solicitudes fallidas. El error ocurrió de nuevo, y NADA estaba en ese registro.
¿Algún otro rastreo que pueda habilitar, por ejemplo?
Lo siguiente que intenté fue esto,
if (context.Response.IsClientConnected)
{
context.Response.Flush();
context.Response.Close();
}
else
{
LogMessage("Client has disconnected before flush was called", Severity.Information);
}
Pero eso no hizo ninguna diferencia. El motivo, aunque supongo, es que el cliente se desconectó mientras se realizaba la descarga, no antes de que se llamara a flush.
Para obtener más detalles sobre esta excepción, visite http://support.microsoft.com/kb/977453
Saque tanto la llamada de Flush()
como la de Close()
. Realmente no los necesitas. Una vez que su manejador haya terminado, saldrá y ASP.NET manejará el cierre de la solicitud.
Además, debe usarse Flush()
cuando esté transmitiendo contenido al cliente (agregando partes a la secuencia de respuesta en bloques). No es necesario utilizarlo con TransmitFile()
.
Tenía problemas similares, obtuve este artículo que explica que Response.End () debe evitarse y en su lugar sugiere usar el método CompleteRequest (). La documentación de MSDN también se ha actualizado con esta información. Espero que esto ayude a alguien.
Tengo el error a veces:
Exception message: An error occurred while communicating with the remote host. The error code is 0x80070057.
Es aleatorio en la producción. No se reproduce en Desarrollo o QA.
Aplicaré esta solución: Response.IsClientConnected Espero que solucione el error.
Fuente:
https://.com/a/11441375/1536197
Use Response.End()
lugar de Response.Flush()
Este es el código fuente de Response.End()
:
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
intente configurar el archivo de tamaño máximo en la configuración web a uno más grande.
Puede configurar maxRequestLength (en kb)
tratar de no reclycle grupos de aplicaciones en iis a menudo también.