Использование .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, при получении файла в диалоге загрузки по умолчанию было указано «Один» в качестве имени файла.Это нормальное последствие?
Заранее спасибо за любую помощь.