IIS7 - Указание заголовка длины содержимого в ASP вызывает ошибку «сброса соединения» - PullRequest
7 голосов
/ 14 июня 2010

Я перевожу серию веб-сайтов с существующего сервера 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 и т. д.) не удастся. Все еще совершенно невежественны.

Ответы [ 3 ]

8 голосов
/ 21 марта 2012

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

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

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

Включение кодированной передачи HTTP 1.1 для World Wide Web издательский сервис, используйте следующий синтаксис:

appcmd set config / section: asp / enableChunkedEncoding: True | False

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

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

2 голосов
/ 26 апреля 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
1 голос
/ 20 апреля 2015

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

От:

Response.Addheader "Content-Length", Размер

Кому:

Response.Addheader "Content-Size", Размер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...