Заголовок длины содержимого отсутствует в ответе Http с функцией Azure v1 - PullRequest
0 голосов
/ 16 января 2020

У нас есть azure функция, которая работает с azure v1 (. NET Framework 4.7). В ответе http мы пытаемся установить длину содержимого, но оно не передается клиенту. Он устанавливает заголовок кодировки Transfer со значением chunked. Чтобы получить представление о том, как мы его настраиваем.

var body = <some byte array data>
var response = new HttpResponseMessage();
response.Content = new ByteArrayContent(body);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentLength = body.Length;

Я прошел некоторые онлайн-обсуждения и Azure / azure -functions-host # 3765 Там они говорили о настройке,

response.Headers.TransferEncoding.Add(TransferCodingHeaderValue.Parse("identity"))

Но, похоже, это бесполезно. Кто-нибудь сталкивался с такой проблемой раньше? Кстати, когда я запускал тот же код на azure function v2 (. NET Core 2.2), он работает.

Обновление: заголовок Transfer-Encoding, который мы могли видеть через захват пакетов с помощью wireshark. Снимок экрана Wireshark, на котором показан заголовок Transfer-Encoding, даже если длина содержимого задана с помощью кода

Update-2: это происходит для функций, работающих локально. Когда мы публикуем sh функцию на azure, она предоставляет заголовок длины содержимого. Локально, я думаю, что (v1) использует nodejs симулятор, который, кажется, имеет некоторые проблемы. Во всяком случае, будет обновлять здесь, когда мы найдем какие-либо обходные пути.

1 Ответ

1 голос
/ 16 января 2020

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

По существу, десятичное значение длины контента в OCTET представляет как длину объекта, так и длину передачи. Если есть некоторая кодировка передачи, то эти две длины будут разными, и, следовательно, значение длины содержимого следует игнорировать.

Я проверяю ваш код в функции v1 без Transfer-Encoding, он тоже работает хорошо.

enter image description here

Таким образом, если вы хотите задать конкретную c длину содержимого, вы можете удалить Transfer-Encoding.

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