Использование .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();
Приведенный выше код ненадежен. Часто случаются повреждения файлов. Клиенты, использующие различные браузеры, иногда прерывают загрузку, иногда скачивают файл, который невозможно прочитать. Вероятность повреждения увеличивается с размером файла. Используя скрипач, мы обнаружили, что в заголовке ответа сообщается, что длина содержимого отличается от исходного размера файла. Поэтому для быстрого тестирования мы закомментировали строку Response.AddHeader ("Content-Length" ...), и проблема с повреждением исчезла.
Q1: эта проблема вызвана динамическим сжатием (по умолчанию включено в IIS7)?
Q2: Если ответ на Q1 положительный, то есть ли какое-нибудь элегантное решение, чтобы сообщить клиенту о Content-Length?
Q3: Удаление заголовка Content-Length, похоже, влияет на способность клиента сохранять файл как. Пример: «Content-Disposition» инициализируется с fileNameSaveAs = «One Two Three.pdf». При использовании Firefox при получении файла в диалоговом окне загрузки в качестве имени файла по умолчанию было выбрано значение «Один». Это нормальное следствие?
Заранее благодарю за любую помощь.