#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 поведение ядра определенно имеет смысл для меня.