Динамично компресиране на IIS 7: това ще направи ли заглавката Content-Length непредсказуема?

Използване на .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" като име на файл. Нормална последица ли е?

Благодаря предварително за всяка помощ.


person Polymerase    schedule 13.05.2011    source източник


Отговори (1)


направи още тестове, изясни няколко неща, но не е технически задоволително.

A1. Динамичната компресия на IIS 7.5 не е причината. Все още възниква повреда при изтегляне, независимо дали динамичната компресия, статичната компресия или и двете са деактивирани. Веднага щом редът Response.AddHeader("Content-Length" ... бъде коментиран в кода. Всички проблеми с изтеглянето изчезнаха.

A2. никаква идея! Наистина бих искал да знам.

A3. Това поведение вероятно е грешка във Firefox. Това няма нищо общо със заглавката "Content-Length".

person Polymerase    schedule 16.05.2011