Как я могу установить для Transfer-Encoding явное или неявное разбиение на части в ответе ASP.NET? - PullRequest
15 голосов
/ 07 апреля 2010

Могу ли я просто установить заголовок Transfer-Encoding?

Будет ли вызов Response.Flush() в какой-то момент вызвать это неявно?


EDIT
Нет, я не могу позвонить Response.Headers.Add("Transfer-Encoding","anything"); Это бросает.

есть другие предложения?


Связанный:
Включить кодирование передачи по частям в ASP.NET

Ответы [ 4 ]

22 голосов
/ 26 апреля 2010

TL; DR: Указание длины содержимого - лучший способ получить быстрый первый байт;вы разрешите чанкинг на уровне TCP, а не на уровне HTTP.Если вы не знаете длину содержимого, установка context.Response.BufferOutput в false будет отправлять выходные данные, так как они записаны в выходной поток с использованием кодировки передачи по частям.


Почему вы хотите установитьTransfer-Encoding: chunked?Транзитные переводы - это, по сути, обходной путь, позволяющий отправлять документы, длина содержимого которых заранее неизвестна.Однако ASP.NET по умолчанию буферизирует весь вывод и, следовательно, знает общую длину содержимого.

Конечно, HTTP является многоуровневым по TCP, и за кулисами TCP все равно «разбивает» на части, разбивая даже монолитный HTTP-ответ на пакеты - это означает, что если вы укажете длину содержимого заранее и отключите буферизацию выводавы получите лучшую задержку без , требующую разбиение на уровни HTTP. Таким образом, вам не нужно чанкинг на уровне HTTP для обеспечения быстрого первого байта, когда вы знаете длину содержимого.

Хотя я не специалист по HTTP, я реализовалпростой сервер потокового мультимедиа с поддержкой поиска, динамическим сжатием, кэшированием и т. д., и я достаточно разумно понимаю актуальность быстрого первого байта - и разбиение на блоки - это, как правило, худший вариант , если вы знаете контентдлина - именно поэтому ASP.NET не позволит вам установить ее вручную - это просто не нужно.

Однако, если вы не не знаете длину содержимого HTTP перед передачейи буферизация слишком дорога, вы отключаете буферизацию вывода, и, по-видимому, сервер по необходимости будет использовать кодирование передачи по частям.

Когда сервер использует кодирование передачи по частям? Я только что проверил, и действительно, если context.Response.BufferOutput установлено на false, а когда длина контента не установлена, ответ разбивается на части;такой отклик на 1-2% больше в моем полностью ненаучном быстром тесте содержимого с кодировкой содержимого 1,7 Мб: gzip xml document.Поскольку gzip полагается на контекст для уменьшения избыточности, я ожидал, что степень сжатия пострадает больше, но кажется, что разбиение на фрагменты не обязательно сильно снижает коэффициенты сжатия.

Если вы посмотрите на код платформы в отражателе,кажется, что кодировка передачи действительно устанавливается автоматически по мере необходимости - то есть, если буферизация отключена, а длина содержимого не известна, и ответ на запрос HTTP / 1.1, используется кодирование передачи по частям.Однако если сервер IIS7 и это рабочий запрос («интегрированный режим»), код переходит к собственному методу - возможно, с таким же поведением, но я не могу это проверить.

0 голосов
/ 21 июня 2016

Response.Buffer = False

Это установит заголовок HTTP «Tranfer-Encoding: Chuncked» и отправит ответ каждый обзванный response.write

0 голосов
/ 02 декабря 2011

Несмотря на то, что вы установили значение Buffer в false и оставили пустым длину содержимого, вам нужно убедиться, что вы отключили функцию «Динамическое сжатие содержимого» для IIS7, чтобы рабочий ответ работал по частям.Кроме того, клиентский браузер должен иметь как минимум HTTP 1.1. Chunked режим не будет работать для HTTP 1.0

0 голосов
/ 21 апреля 2010

Похоже, вам нужно настроить IIS для этого.IIS 6 имеет свойство AspEnableChunkedEncoding в метабазе, и вы можете увидеть сопоставления IIS 7 для этого на MSDN в http://msdn.microsoft.com/en-us/library/aa965021(VS.90).aspx. Это позволит вам установить TRANSFER-ENCODING: chunked в вашем заголовке.Надеюсь, это поможет.

...