【问题标题】:Content Length header is not present in Http response with Azure function v1使用 Azure 函数 v1 的 Http 响应中不存在内容长度标头
【发布时间】:2020-05-02 21:06:36
【问题描述】:

我们有运行 azure v1 (.NET Framework 4.7) 的 azure 函数。在 http 响应中,我们正在尝试设置内容长度,但它没有流向客户端。它将传输编码标头的值设置为分块。 看看我们是如何设置它的。

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;

我经历了一些online discussionAzure/azure-functions-host#3765 他们在那里谈到了设置,

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

不过好像没什么用。 以前有人会遇到这样的问题吗? 顺便说一句,当我在 azure function v2 (.NET Core 2.2) 上运行相同的代码时,它可以工作。

更新:我们可以通过使用wireshark 的数据包捕获看到Transfer-Encoding 标头。 Wireshark screenshot depicting Transfer-Encoding header even if content-length is set through code

Update-2 :这发生在本地运行的函数上。当我们在 azure 上发布该函数时,它确实提供了内容长度标头。在本地,我猜它(v1)使用 nodejs 模拟器,这似乎有一些问题。无论如何,一旦我们找到任何解决方法,就会在这里更新。

【问题讨论】:

    标签: azure azure-functions


    【解决方案1】:

    如果将 Transfer-Encoding 设置为分块,则无法设置 Content-length。渐进式渲染不需要Transfer-Encoding: chunked。但是,如果在发送第一个字节之前总内容长度未知,则需要它。

    基本上,OCTET 中内容长度的十进制值代表实体长度和传输长度。如果有一些传输编码,那么这两个长度会不同,因此内容长度值应该被忽略。

    我在没有Transfer-Encoding 的情况下在函数 v1 中使用您的代码进行测试,它也可以正常工作。

    所以如果你想设置特定的内容长度,你可以删除Transfer-Encoding

    【讨论】:

    • 感谢乔伊的快速回复。当我们在调试检查模式下查看标头时,它确实在流向客户端时显示了 Content-Length BUT,我们仍然可以看到 Transfer-Encoding: 通过使用 wireshark 捕获数据包进行分块。用wireshark截图更新了问题。我还尝试显式删除 Header :response.Headers.Remove("Transfer-Encoding") 但这也不起作用。此外,同样的事情适用于 Azure 函数 V2。我猜 Azure 函数 V1 肯定有一些内部处理在 V2 中没有发生
    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2013-01-23
    • 2012-04-01
    相关资源
    最近更新 更多