Динамическое сжатие IIS 7: сделает ли заголовок Content-Length непредсказуемым? - PullRequest
1 голос
/ 13 мая 2011

Использование .NET 4.0 в IIS 7.5 в Windows 2008 R2.

Я хотел бы вывести двоичное содержимое, представляющее различные типы документов (изображения, PDF, файлы Office и т. Д.).Давайте предположим, что весь контент уже находится в MemoryStream, я хотел бы вывести его следующим образом:

Response.Clear();
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", fileNameSaveAs));
Response.AddHeader("Content-Length", memoryStr.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.OutputStream.Write(memoryStr.ToArray(), 0, (int) memoryStr.Length);
Response.Flush();

Приведенный выше код не является надежным.Там часто файлы повреждены.Клиенты, использующие различные браузеры, иногда прерывают загрузку, иногда скачивают файл, который невозможно прочитать.Вероятность повреждения увеличивается с размером файла.Используя fiddler, мы обнаружили, что в заголовке ответа указана длина содержимого, отличная от исходного размера файла.Поэтому для быстрого теста мы закомментировали строку Response.AddHeader («Content-Length» ...) и проблема с коррупцией исчезла.

Q1: эта проблема вызвана динамическим сжатием (включенным в IIS7по умолчанию)?

Q2: если ответом на вопрос Q1 является «да», то существует ли элегантное решение для информирования клиента о Content-Length?

Q3: удаление заголовка «Content-Length»похоже, влияет на способность клиента сохранять файл как.Пример: «Content-Disposition», инициализируется с fileNameSaveAs = «One Two Three.pdf».Используя Firefox, при получении файла в диалоге загрузки по умолчанию было указано «Один» в качестве имени файла.Это нормальное последствие?

Заранее спасибо за любую помощь.

1 Ответ

1 голос
/ 16 мая 2011

сделал больше тестов, прояснил несколько вещей, но технически неудовлетворительно.

A1. IIS 7.5 Динамическое сжатие не является причиной. Повреждение загрузки по-прежнему происходило независимо от того, отключено ли динамическое сжатие, статическое сжатие или оба. Как только строка Response.AddHeader ("Content-Length" ... закомментирована в коде. Все проблемы с загрузкой исчезли.

A2. без понятия! Я действительно хотел бы знать.

A3. Такое поведение, вероятно, ошибка Firefox. Это не имеет ничего общего с заголовком «Content-Length».

...