Използване на .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, при получаване на файла, диалоговият прозорец за изтегляне по подразбиране е "One" като име на файл. Нормална последица ли е?
Благодаря предварително за всяка помощ.