Pregunta

Tengo el siguiente código para descargar archivos:

        FileInfo fileInfo = new FileInfo(filePath);

        context.Response.Clear();
        context.Response.ContentType = "application/octet-stream";
        context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.IO.Path.GetFileName(filePath));
        context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
        context.Response.WriteFile(filePath);
        context.Response.End();

Cuando lo ejecuto en mi IIS6 local, funciona bien. El navegador web (probado en IE8, Firefox 3.5.2, Opera 10) muestra la longitud del archivo antes de comenzar a descargar el archivo.

Cuando ejecuto este código en IIS7 remoto, el navegador web no muestra la longitud del archivo. La longitud del archivo es desconocida.

¿Por qué no obtengo la longitud del archivo cuando este código se ejecuta bajo IIS7?

¿Fue útil?

Solución

Utilice Fiddler para verificar lo que se envía realmente. Supongo que está obteniendo codificación fragmentada como resultado de que el almacenamiento en búfer se configure como falso en el servidor IIS7.

Por cierto, suelte la respuesta. Finalizar la llamada es algo bastante traumático y es innecesario (para el caso, también lo es la llamada a Clear).

Editar

Hablando estrictamente cuando se transmite contenido con codificación fragmentada (lo cual es deseable en su escenario), el encabezado Content-Length no debe estar presente (consulte RFC2616 Sección 4.4 .) Me parece que IIS7 se encarga de hacer cumplir esto. De hecho, tuve un escenario Classic-ASP en el que IIS7 arroja un error cuando el código COM intenta agregar un encabezado Content-Length cuando el almacenamiento en búfer está desactivado.

Esto es realmente molesto porque a pesar de lo que le gustaría al comité en las torres de marfil, este encabezado le da al usuario final una información muy útil.

Otros consejos

Gracias por esta publicación ... Lo conseguí trabajando para IE con la primera línea.

public void WriteCSV(string strData) {
   //Required for IIs7 WS2008R2 fix
   Response.ClearHeaders();
   Response.Clear();


   Response.Buffer = true; 
   Response.ContentType = "application/csv";
   Response.AddHeader("Content-Disposition", "attachment;filename=report.csv");
   Response.Write(strData);
   Response.Flush();
   Response.End();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top