ASP.NET ядро: запросы HTTP HEAD и заголовок Content-Length

#http #asp.net-core #asp.net-core-webapi #browser-cache #http-content-length

#http #asp.net-ядро #asp.net-core-webapi #кэш браузера #http-content-length

Вопрос:

Этот вопрос связан с ASP.NET ядро 2.2 веб-приложение (нацеливание.NET core), предоставляющий доступ к некоторым контроллерам web api, реализованным с использованием промежуточного программного обеспечения mvc. Все методы действий, доступные во всех контроллерах, должны отвечать как на http-методы GET, так и на http-методы HEAD.

Мы заметили, что ASP.NET ядро автоматически добавляет Transfer-Encoding заголовок со значением chunked и, в соответствии со спецификациями, опускает Content-Length заголовок (смотрите эту страницу MDN для получения более подробной информации).

Согласно этой проблеме github на ASP.NET основной репозиторий похоже, что такое поведение зависит от точного проектного решения веб-сервера Kestrel, так что это предполагаемое поведение.

Тем не менее, каждый раз, когда мы отправляем запрос HEAD на любой маршрут нашего приложения, мы получаем ответ, для Content-Length заголовка которого установлено значение 0, даже когда соответствующий запрос GET (я имею в виду запрос GET, имеющий тот же путь) возвращает непустое тело ответа.

Согласно тому, что я прочитал в различных источниках, кажется, что Content-Length заголовок не является обязательным для ответа на запрос HEAD, но при включении он должен иметь то же значение, что и соответствующий запрос GET. Таким образом, значение 0 , которое мы видим в каждом запросе HEAD, мне не кажется правильным.

Является ли это побочным эффектом того факта, что для соответствующего запроса GET, ASP.NET ядро отправляет ответ с использованием фрагментов (как объяснено выше, Transfer-Encoding всегда chunked для запросов GET)?

Другое сомнение связано с любым видом кэша, отправляющего запросы HEAD нашему приложению, чтобы решить, следует ли удалять кэшированный ответ: представляет ли нулевая длина содержимого риск для корректности поведения кэширования?

ПРАВКА ОТ 27 марта 2018

Мы повторили наши тесты и получили другие, но более значимые результаты. Я могу подтвердить, что запросы GET и HEAD не отправляют заголовок Content-Length. Это определенно имеет смысл в соответствии с тем фактом, что тело ответа всегда передается клиенту порциями, как объяснено выше.

Тем не менее, я думаю, что ASP.NET поведение ядра определенно имеет смысл для меня.