У меня простой веб-сайт с двумя страницами. Один отображает список файлов, а другой потоковый файл, когда он щелкает в списке. Все было в порядке в течение 6 месяцев, но теперь мне нужно перенести сайт на Windows 2008 / IIS7. У меня это в основном работает, но файлы не открываются должным образом (в Firefox), потому что мой заголовок типа контента игнорируется. На производственной площадке (IIS6) заголовки (с использованием Fiddler):
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
но на тестовом сервере IIS7 я получаю:
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"
Fiddler также сообщает о нарушении протокола и сообщает: «Несоответствие длины содержимого: заголовок ответа потребовал 236841 байт, но сервер отправил 238378 байт».
Мой код выглядит так:
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();
Я пытался это исправить пару дней. Я не очень знаком с IIS7 и изо всех сил пытался найти, где изменить различные настройки. Мне удалось разобраться с двумя управляемыми режимами конвейера и исправить некоторые другие проблемы, переключившись на классический .NET AppPool (при передаче файла возникали всевозможные ошибки).
Есть ли какой-нибудь способ сказать IIS7 не перезаписывать мой заголовок ContentType, если это то, что происходит?