2009-09-11 3 views
8

Я просматриваю некоторые устаревшие коды, и я нашел ошибку, которая заставляет отклик сидеть бесконечно.Нужно ли установить Content-Length в заголовке ответа?

Вот основная идея:

Response.Content-Type = "application/octet-stream" 
Response.AddHeader("Content-Disposition", "attachment; filename" & someFileName) 
Response.AddHeader("Content-Length", someStoredLength) 
Response.BinaryWrite(someByteArray) 
Response.Flush() 
Response.End() 

Проблема заключается в том, что someStoredLength гораздо больше, чем фактический размер someByteArray, так что клиент просто сидит там ждет загрузки файла, а браузер просто вращается.

Я рассматриваю просто удаление AddHeader, который задает длину содержимого, потому что когда я делаю это, все работает нормально, но я беспокоюсь, что я что-то не понимаю.

Это нормально для меня, чтобы удалить этот AddHeader или я должен найти лучший способ справиться с этой проблемой?

+0

Какой язык это? Какой класс является объектом Response в приведенном выше коде? – noctonura

+0

@RichAmberale: Это не имеет отношения к вопросу. Проблема возникает в браузере из-за заголовков HTTP. –

+0

Код находится в VB.NET, но я могу найти это в других местах, где наследие сделано в ASP classic – Joseph

ответ

8

Изменение Content-Length линии следующее:

Response.AddHeader("Content-Length", someByteArray.Length.ToString()) 
+0

Я тоже думал об этом. Мне было интересно, будет ли это хорошей альтернативой. Если у меня есть массив байтов, свойство Length всегда даст мне правильный размер? – Joseph

+0

Да. Заголовок content-length указывает количество байтов в содержимом. Ваш контент представляет собой массив байтов, поэтому вы хороши. – Stephen

10

Ваше приложение SHOULD (прокрутите вниз до Content-Length) определите его, однако это строго не требуется.

Вот decent discussion возможных вариантов.

+2

Предлагаемое решение в связанной статье («просто установите длину на какое-то произвольное значение, которое будет вероятно слишком большим») кажется ДЕЙСТВИТЕЛЬНО плохая идея. Даже если он не сломает ничего с текущими пользовательскими агентами, он подрывает всю концепцию заголовка Content-length и может нарушать необычные, но полностью совместимые со стандартами HTTP-клиентские библиотеки. Если размер файла неизвестен заранее, во всех случаях следует использовать кодирование с кодировкой передачи (и должно использоваться, если соединение должно быть повторно использовано (keep-alive)). – lxgr

+0

Прямая ссылка на [Content-Length] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13), см. Также [HttpBis] (http://tools.ietf.org /html/draft-ietf-httpbis-p1-messaging-25#section-3.3.2) – paulkmoore