загрузка больших файлов медленная, если указана длина содержимого (IIS7) - PullRequest
1 голос
/ 04 февраля 2010

У меня есть веб-страница asp.net для загрузки больших файлов пользователям. Страница размещена на IIS7, Windows Server 2008.

Странно то, что пользователи могут загружать файлы с хорошей скоростью (2 МБ / с), когда я не добавляю заголовок ответа с длиной содержимого, но как только я добавляю этот заголовок, скорость загрузки падает примерно до 35 Кбит / с.

Это код:

Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/octet-stream";
//speed drops when I add this line:
//Response.AddHeader("Content-Length", new FileInfo(filepath).ToString());

Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
Response.TransmitFile(filepath);

Response.Flush();

Конечно, я могу опустить длину содержимого, но пользователь не будет знать, насколько велик размер файла и сколько времени займет загрузка ... что раздражает.

Есть идеи, что может вызвать такое большое изменение в скорости загрузки?

Заранее спасибо за любые идеи!

Ответы [ 2 ]

1 голос
/ 19 февраля 2010

Недавно я использовал следующий код ...

Response.AddHeader("Content-disposition", "attachment; filename=" + attachment.Filename);
Response.AddHeader("Content-length", attachment.Filedata.Length.ToString());
Response.ContentType = attachment.ContentType;
Response.OutputStream.Write(attachment.Filedata.ToArray(), 0, attachment.Filedata.Length);
Response.End();

(в этом случае мои вложения фактически сохраняются в таблице базы данных, но это просто запись байтового массива в выводпоток)

, а не ваш подход ...

Response.TransmitFile(filepath);

Скорость передачи кажется довольно хорошей.Я скачал 3,5 МБ в считанные секунды с живого сайта.(не только локально!)

Я знаю, что должен использовать HttpHandler, а не перехватывать Response, но пока это работает.Кроме того, мне, вероятно, следует прочитать байтовый массив порциями, чтобы не занимать слишком много памяти.В какой-то момент я вернусь и немного переделаю.

Итак, вместо этого вы можете попробовать Response.OutputStream.Write или написать HttpHandler.

В любом случае, я надеюсь, это поможет вам.1018 *

0 голосов
/ 13 мая 2011

Response.AddHeader ("Content-Length", ...) является катастрофой!

Мы использовали .NET 4.0 и испытали множество странных и случайных повреждений при загрузке.Мы сузились до несоответствия длины контента в заголовке ответа, отправляемого клиенту.Мы не знаем почему, может быть ошибка .NET 4.0?Но как только мы закомментировали строку кода Response.AddHeader («Content-Length», ...), все проблемы исчезли.

РЕДАКТИРОВАТЬ: может быть, несоответствие в длине содержимого неизбежно, когда IIS7 Dynamic Compressionвключен.

...