Tengo un sitio web simple con dos páginas. Uno muestra una lista de archivos, y el otro transmite un archivo cuando se hace clic en la lista. Todo estuvo bien en producción durante 6 meses, pero ahora tengo que mover el sitio a Windows 2008/IIS7. Lo tengo funcionando principalmente, pero los archivos no se abren correctamente (en Firefox) porque se está ignorando mi encabezado de tipo de contenido. En el sitio de producción (IIS6) las cabeceras son (utilizando Fiddler):¿Por qué IIS7 ignora mi encabezado de tipo de contenido cuando uso ASP.NET para transmitir archivos?
HTTP/1.1 200 OK
Date: Tue, 09 Feb 2010 16:00:51 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Content-Disposition: attachment; filename="myfile__foo.pdf"
Content-Length: 236841
Cache-Control: no-cache, no-store
Pragma: no-cache
Expires: -1
Content-Type: application/octet-stream
pero en el servidor IIS7 prueba de recibo:
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 236841
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
Content-Disposition: attachment; filename="myfile__foo.pdf"
violinista también informa de una violación del protocolo y dice "Content-length no coincidencia: el encabezado de respuesta reclamó 236841 bytes, pero el servidor envió 238378 bytes ".
Mi código es el siguiente:
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + doc.DisplayFilename + "." + doc.FileExtension + "\"");
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.TransmitFile(file.FullName);
Response.End();
que he estado tratando de solucionar este problema durante un par de días. No estoy tan familiarizado con IIS7 y he tenido problemas para encontrar dónde cambiar varias configuraciones. Me las arreglé para averiguar sobre los dos modos de canalización administrados y solucionó algunos otros problemas al cambiar a Classic .NET AppPool (Integrated lanzaba todo tipo de errores al transmitir el archivo).
¿Hay alguna manera de decirle a IIS7 que no sobrescriba mi encabezado ContentType, si eso es lo que está sucediendo?
Resultó que no tenía nada que ver con IIS7, tenía que ver con algún código de manejo de errores que había agregado. Response.End() parece ser un error, aunque numerosos ejemplos web contienen esa línea. Causa una excepción de "Se estaba interrumpiendo el hilo". Esto causó que se ejecute mi controlador de errores, que hace un Server.Transfer a una página de error. Entonces, la respuesta tenía otros encabezados, el archivo y el comienzo del HTML de la página de error en la parte inferior. Cuando la página de error comenzó a escribirse, volcó el tipo de contenido de nuevo a HTML. Relato breve: Al eliminar la instrucción Response.End() se solucionó el problema. –
¡Muy interesante! No he visto este comportamiento de Response.End antes ... lo tendré en cuenta. – Bryan
Aparentemente, también tuve el mismo problema y al eliminar Response.End() lo resolví. Parece que estaba deshaciendo mi encabezado de tipo de contenido personalizado (image/tiff) y lo reinicié en texto/html, lo que causa confusión en el navegador. –