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

时间:2016-02-17 17:58:26

标签: asp.net asp.net-core dotnet-httpclient .net-core

我正在尝试将一些JSON发布到外部API,这会因为我的内容被分块而失败。有人可以告诉我如何禁用它吗?

我正在使用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时,似乎仍然将Transfer-Encoding设置为“chunked”。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:8)

似乎您也需要设置Content-Length标头,否则,似乎需要在MaxRequestContentBufferSize上使用HttpClientHandler对数据进行分块。

请尝试使用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;
    }
}

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