HttpContext lanza HttpException

He escrito un controlador http personalizado. He hecho esto escribiendo una clase que implementa el IHttphandler.

Dentro de esa clase tengo un 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();

Ocasionalmente 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, el seguimiento de la pila es este,

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 producción, y si miro hacia atrás en los últimos días, se han producido errores 23 veces, y en total el código anterior se ha 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 diálogos de descarga) y luego cancelará algunos de ellos. Dicho esto, 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 los oyentes registran el tráfico del controlador personalizado? pero no pude hacerlo funcionar.

in embargo, lo que encontré es que he habilitado el seguimiento de IIS para registrar solicitudes fallidas. El error volvió a ocurrir 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. Sin embargo, supongo que la razón es que el cliente se desconectó mientras se realizaba la descarga, no antes de que se llamara flush.

Respuestas a la pregunta(7)

Su respuesta a la pregunta