如何使用 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
来分块数据。
尝试使用StringContent
、ByteArrayContent
或StreamContent
(如果蒸汽可搜索),因为它们能够为您计算长度。
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 操作