如何在ASP.Net C#中使用HttpClient禁用分块传输编码

32

我正在尝试向外部API发布一些JSON,但由于我的内容是分块的,所以一直失败。请问有人能告诉我如何禁用它吗?

我正在使用ASP.NET 5,所以我认为我正在使用System.Net.Http,版本为4.0.1.0

这是我尝试过的代码:

using (var client = new HttpClient())
{
    // TODO - Send HTTP requests
    client.BaseAddress = new Uri(apiBaseUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("SAML", samlToken);
    client.DefaultRequestHeaders.TransferEncodingChunked = false;

    HttpResponseMessage response = await client.PostAsJsonAsync(path, jsonObject);
}

但是当我检查 Fiddler 时,它仍然似乎将传输编码设置为“chunked”。

有人能帮忙解决这个问题吗?


1
似乎是个bug?https://github.com/dotnet/runtime/issues/30283 - Toolkit
2个回答

29

如果您不设置Content-Length头,似乎会使用HttpClientHandler上的MaxRequestContentBufferSize来分块发送数据。

尝试使用StringContentByteArrayContentStreamContent(如果流是可寻址的),因为这些对象可以为您计算长度。

var content = new StringContent(json);

HttpResponseMessage response = await client.PostAsync(content);
< p > PostAsJsonAsync 扩展方法在底层创建ObjectContent,它不会计算Content-Length并返回false:

public class ObjectContent : HttpContent
{
    /* snip */

    protected override bool TryComputeLength(out long length)
    {
        length = -1L;
        return false;
    }
}

因此,将始终回退到按缓冲区大小分块。


4

您仍然可以结合使用JsonContentLoadIntoBufferAsync,请查看此答案

var content = JsonContent.Create(someObject);
await content.LoadIntoBufferAsync();
HttpResponseMessage response = await _httpClient.PutAsync($"/endpoint", content);

1
如果您使用的是.PostAsJsonAsync(),而不是PutAsync()/PostAsync(),则此方法无法正常工作。@kevin-smith在他的帖子中指出了这一点。 - Cryptc
如果在 .NET 6 中将 JsonContent 包含在 MultipartFormDataContent 中,这也是行不通的。 - Mr Patience
是的,你不能使用PostAsJsonAsync()。相反,你需要实例化JsonContent,将内容加载到缓冲区中,然后将其传递给PostAsync() - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接