Response.End () vs HttpContext.Current.ApplicationInstance.CompleteRequest () [duplicate]

Esta pregunta ya tiene una respuesta aquí:

¿Response.End () es considerado dañino? 8 respuestas

Los usuarios de nuestra aplicación descargan un archivo adjunto al menos una vez en dos segundos durante el día.

Escenario anterior:

Estábamos usando Response.End () para cancelar la conexión con el cliente después de que el usuario descarga un archivo adjunto. Como estábamos teniendo problemas de rendimiento, comenzamos a registrar excepciones y una de las más repetidas fue la excepción de cancelación de subprocesos. Ya que estamos obteniendo el archivo adjunto de un servicio web, tenemos que hacer un poco de limpieza y tuvimos la limpieza en el bloque try-catch-finally. Después de algunas investigaciones, he entendido que cualquier código después de Response.End () no se ejecutará incluso si finalmente está en el bloque. ¿Está bien?

Escenario actual:

He leído el hilo en el desbordamiento de pila sobre Response.End () que es dañino y que debe usarse solo cuando es realmente necesario, así que decidí usar HttpContext ... CompleteRequest () en su lugar. Con este código, se realiza la limpieza necesaria, pero el html que se representa se adjunta al archivo adjunto descargado. Intenté anular el Render and RaisePostBackEvent sugerido en el mismo artículo pero el problema aún persiste. Cualquier idea sobre cómo resolver este problema sería útil.

Código:

HttpContext.Current.Response.Clear();

Response.ClearContent();

Response.ClearHeaders();

Response.AddHeader("Content-Disposition", "attachment; filename=" +   
filename);
Response.AddHeader("Content-Length", fileContent.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.BinaryWrite(fileContent);
Response.Flush();