Почему IIS7 игнорирует мой заголовок типа содержимого, когда я использую ASP.NET для потоковой передачи файлов?

У меня простой веб-сайт с двумя страницами. Один отображает список файлов, а другой транслирует файл при щелчке по нему в списке. Все работало нормально в течение 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, если это происходит?


person John Price    schedule 09.02.2010    source источник


Ответы (1)


У вас нет HttpModules, изменяющих запрос / ответ? Файлы web.config точно такие же?

Откуда берутся эти лишние 2 Кбайта? Что в них?

person Bryan    schedule 09.02.2010
comment
Оказалось, что это не имеет ничего общего с IIS7 - это связано с добавленным мной кодом обработки ошибок. Response.End () кажется ошибкой, хотя многие веб-примеры содержат эту строку. Это вызывает исключение прерывания потока. Это привело к запуску моего обработчика ошибок, который выполняет Server.Transfer на страницу с ошибкой. Таким образом, в ответе были другие заголовки, файл и начало HTML-кода страницы с ошибкой внизу. Когда страница с ошибкой начала писать, тип содержимого вернулся к HTML. Краткая история: удаление оператора Response.End () решило проблему. - person John Price; 18.02.2010
comment
Очень интересно! Не видел такого поведения в Response.End раньше ... Буду иметь в виду. - person Bryan; 18.02.2010
comment
По-видимому, я тоже столкнулся с той же проблемой, и удаление Response.End () решило ее. Похоже, он отменял мой собственный заголовок Content-Type (image / tiff) и сбрасывал его на text / html, что сбивало браузер с толку. - person Philippe Monnet; 16.09.2010