2009-04-10 25 views
5

Inicialmente estaba tratando de averiguar cuál es la diferencia entre Response.Close y Response.End, pero después de hacer más búsquedas en Google e investigar, está claro que no he visto un elemento común forma en que se devuelve un byte [] al cliente. Dejaré el ejemplo del código a continuación, pero me gustaría saber cuál es el estándar de la industria para hacer esto.ASP.NET Cómo transmitir un archivo al usuario

Byte[] myBytes = GetReportBytes(); 
HttpContext.Current.Response.ClearContent(); 
HttpContext.Current.Response.AppendHeader("content-length", myBytes.Length.ToString()); 
HttpContext.Current.Response.AppendHeader("content-Disposition", "attachment;filename=" + this.ReportFileName + GetReportExtension()); 
HttpContext.Current.Response.ContentType = GetApplicationContentType(); 
HttpContext.Current.Response.BinaryWrite(myBytes); 
HttpContext.Current.Response.Flush(); 
HttpContext.Current.Response.Close(); 
//CERT FIX 
//HttpContext.Current.Response.End(); 

Respuesta

15

yo no lo llamaría Response.Close() o Response.End().

Response.End() detendrá la ejecución/representación de página en ese punto. No se ejecutará ningún código después de Response.End(). La respuesta finaliza en ese punto sin agregar más salidas a la transmisión.

Response.Close() es similar a Response.End(), pero permite que el código se ejecute después de haber sido llamado (pero no se pueden enviar más resultados en la respuesta de la página).

Response.Flush() enviará los elementos de respuesta restantes a la página.

Desde un IIS core team member: Response.Close

envía un paquete de reposición a el cliente y usarlo en cualquier cosa que no sea condición de error conducirá a todo tipo de problemas - por ejemplo, si usted está hablando con un cliente con suficiente latencia , el paquete de reinicio puede causar cualquier otro dato de respuesta almacenado en el servidor entre el servidor, el cliente o en algún lugar en entre para descartar.

En este caso particular, la compresión implica buscar patrones comunes dentro de la respuesta y una cierta cantidad de respuesta ha de ser amortiguada por el código de compresión para aumentar la ocasión de encontrar ya repetir patrones - esta parte que no se puede enviar al cliente hacer Response.Close().

En resumen, no use Response.Close().

+0

Gracias por la información ... – RSolberg

+0

@Mitch - Voy a cambiar la pregunta un poco para obtener más información sobre cómo transmitir en general. Realmente no veo un estándar para esto y me gustaría comenzar allí. – RSolberg

+3

¿No llamas a Response.Close() o Response.End() cuando estás transmitiendo un archivo? Simplemente llame a Response.Flush() para enviar el archivo fuera del buffer y finalizar el método? – StuperUser

Cuestiones relacionadas