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

Posted

技术标签:

【中文标题】如何使用 HttpClient 在 ASP.Net C# 中禁用分块传输编码【英文标题】:How to disable Chunked Transfer Encoding in ASP.Net C# using HttpClient 【发布时间】:2016-02-17 17:58:26 【问题描述】:

我正在尝试将一些 JSON 发布到外部 API,但由于我的内容被分块,该 API 一直失败。谁能告诉我如何禁用它?

我使用的是 ASP.NET 5,所以认为我使用的是 System.Net.Http,Version=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 时,它似乎仍然将 Transfer-Encoding 设置为“chunked”。

有人可以帮忙吗?

【问题讨论】:

似乎是这个错误? github.com/dotnet/runtime/issues/30283 【参考方案1】:

看来您还需要设置Content-Length 标头,如果您不这样做,似乎在发送数据时使用HttpClientHandler 上的MaxRequestContentBufferSize 来分块数据。

尝试使用StringContentByteArrayContentStreamContent(如果蒸汽可搜索),因为它们能够为您计算长度。

var content = new StringContent(json);

HttpResponseMessage response = await client.PostAsync(content);

PostAsJsonAsync 扩展方法在底层创建 ObjectContent,它不会计算 Content-Length 并返回 false:

public class ObjectContent : HttpContent

    /* snip */

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

因此总是会退回到分块到缓冲区大小。

【讨论】:

以上是关于如何使用 HttpClient 在 ASP.Net C# 中禁用分块传输编码的主要内容,如果未能解决你的问题,请参考以下文章

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

ASP.NET Core中如何针对一个使用HttpClient对象的类编写单元测试

ASP.NET Core中如何针对一个使用HttpClient对象的类编写单元测试

如何使用 .Net 4.0 中包含的 HttpClient 类将文件上传到在 IIS Express 中运行的 Asp.Net MVC 4.0 操作

ASP.NET WebApi:如何使用 WebApi HttpClient 通过文件上传执行多部分发布

在 ASP.NET Core 应用程序中使用多个 HttpClient 对象