如何使用HttpClient在ASP.Net C#中禁用Chunked Transfer Encoding

don*_*y80 17 asp.net dotnet-httpclient .net-core asp.net-core

我正在尝试将一些JSON发布到外部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);
}
Run Code Online (Sandbox Code Playgroud)

但是当我检查Fiddler时,似乎仍然将Transfer-Encoding设置为"chunked".

有人能帮忙吗?

Kev*_*ith 11

看起来你也需要设置Content-Length标题,如果不这样做,它似乎在发送时使用MaxRequestContentBufferSizeon HttpClientHandler来分块数据.

尝试使用a StringContent,ByteArrayContentStreamContent(如果蒸汽是可寻找的),因为这些将能够为您计算长度.

var content = new StringContent(json);

HttpResponseMessage response = await client.PostAsync(content);
Run Code Online (Sandbox Code Playgroud)

PostAsJsonAsync扩展方法创建ObjectContent不计算在引擎盖下Content-Length,并返回false:

public class ObjectContent : HttpContent
{
    /* snip */

    protected override bool TryComputeLength(out long length)
    {
        length = -1L;
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此总是会回退到缓冲区大小的块.