У меня простой веб-сайт с двумя страницами. Один отображает список файлов, а другой транслирует файл при щелчке по нему в списке. Все работало нормально в течение 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 и изо всех сил пытался найти, где изменить различные настройки. Мне удалось разобраться в двух режимах управляемого конвейера и исправить некоторые другие проблемы, переключившись на Classic .NET AppPool (Integrated выдает всевозможные ошибки при передаче файла).
Есть ли способ указать IIS7 не перезаписывать мой заголовок ContentType, если это происходит?