IIS7 - указание заголовка длины содержимого в ASP вызывает ошибку сброса соединения

Я переношу серию веб-сайтов с существующего сервера IIS5 на новый веб-сервер IIS7. Одна из страниц извлекает файл данных из большого двоичного объекта в базе данных и передает его конечному пользователю:

Response.ContentType = rs("contentType")
Response.AddHeader "Content-Disposition", "attachment;filename=" & Trim(rs("docName"))&rs("suffix")' let the browser know the file name
Response.AddHeader "Content-Length", cstr(rs("docsize"))' let the browser know the file size

Проверяя это в новой установке IIS7, я получаю ошибку «Сброс подключения» как в Internet Explorer, так и в Firefox. Документ обслуживается правильно, если заголовок Content-Length удален (но тогда пользователь не получит полезного индикатора выполнения).

Есть идеи, как это исправить; будь то вариант конфигурации сервера или через код?

Редактировать 1: Еще немного проб и ошибок. Запросы будут выполнены успешно, если оба параметра «Включить буферизацию» и «Включить кодирование фрагментов» имеют значение false. Если один из них включен, возникает ошибка.

Изменить 2: больше испытаний методом проб и ошибок; оказывается, что текстовые файлы нормально работают со скриптом; только двоичные файлы (изображения, PDF-файлы и т. д.) не будут работать. В остальном все еще совершенно невежественен.


person MisterZimbu    schedule 14.06.2010    source источник


Ответы (3)


Как уже упоминалось в другом месте: http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Он использует заголовок HTTP-ответа Transfer-Encoding вместо заголовка Content-Length, который в противном случае потребовал бы протокол. Поскольку заголовок Content-Length не используется, серверу не нужно знать длину содержимого, прежде чем он начнет передавать ответ клиенту (обычно веб-браузеру). Веб-серверы могут начать передачу ответов с динамически сгенерированным контентом, прежде чем узнает общий размер этого контента.

В IIS7 это включено по умолчанию: http://technet.microsoft.com/en-us/library/cc730855(v=ws.10).aspx

Чтобы включить кодирование передачи фрагментов HTTP 1.1 для службы публикации World Wide Web, используйте следующий синтаксис:

appcmd установить config / section: asp / enableChunkedEncoding: True | False

True включает кодирование передачи по частям HTTP 1.1, тогда как False отключает кодирование передачи по частям HTTP 1.1. Значение по умолчанию верно.

У нас была та же проблема, наше решение: удалить AddHeader "Content-Length"

person Boklucius    schedule 21.03.2012
comment
После перехода с XP Pro на Server 2008 R2 возникла ошибка. Мне пришлось удалить заголовок Content-Length, чтобы решить проблему. - person linquize; 06.10.2012
comment
Та же проблема и решение здесь. Как бы то ни было, вы можете изменить Content-Length на Content-Size, и он будет работать, хотя клиент может не распознать этот (теперь устаревший) заголовок. - person ingredient_15939; 26.04.2013

Есть два варианта заставить его работать:

  1. Выведите заголовок Content-Size вместо Content-Length. Обратите внимание, что не все клиенты узнают об этом, но, по крайней мере, это работает.

  2. (Предпочтительно) Установите Response.Buffer в True, затем вы можете использовать заголовок Content-Length и самостоятельно обрабатывать "фрагменты" (таким образом, не нагружая буфер памяти ASP):

Следующее работает для меня на IIS7 и, кажется, правильно отправляет информацию о размере файла в браузер.

Response.Buffer = True
Response.ContentType = "application/pdf"
Response.AddHeader "Content-Disposition", "attachment; filename=""yourfile.pdf"""

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile "yourfile.pdf"

Response.AddHeader "Content-Length", objStream.Size

' Send file in chunks. '
lByteCount = 0
lChunkSize = 100000
While lByteCount < objStream.Size
  If lByteCount + lChunkSize > objStream.Size Then lChunkSize = objStream.Size - lByteCount
  Response.BinaryWrite objStream.Read(lChunkSize)
  Response.Flush ' Flush the buffer every 100KBytes '
  lByteCount = lByteCount + lChunkSize
Wend

objStream.Close
Set objStream = Nothing
person ingredient_15939    schedule 26.04.2013

Обнаружена та же проблема при переносе кода ASP с сервера Windows 2003 на Windows 2012 с IIS 8.5. Исправление заключалось в корректировке кода ASP следующим образом:

От:

Response.Addheader "Content-Length", Size

To:

Response.Addheader "Content-Size", Size

person Help Desk    schedule 20.04.2015