2010-02-09 12 views
5

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?

Respuesta

0

¿No tiene HttpModules modificando la Solicitud/Respuesta? ¿Son los archivos web.config exactamente iguales?

¿De dónde vienen estos 2K bytes extra? ¿Qué hay en ellos?

+1

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. –

+0

¡Muy interesante! No he visto este comportamiento de Response.End antes ... lo tendré en cuenta. – Bryan

+0

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. –

Cuestiones relacionadas