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 и это рабочий запрос («интегрированный режим»), код переходит к собственному методу - возможно, с таким же поведением, но я не могу это проверить.