How to disable Chunked Transfer Encoding in ASP.Ne

2020-02-10 03:46发布

问题:

I'm trying to post some JSON to an external API which keeps failing because my content is chunked. Please can someone tell me how to disable it?

I'm using ASP.NET 5 so think I'm using System.Net.Http, Version=4.0.1.0

Here is the code I've tried:

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);
}

But It still seems to have the Transfer-Encoding set to "chunked" when I check Fiddler.

Can anyone help with this?

回答1:

It looks like you need to set the Content-Length header too, if you don't it seems to use the MaxRequestContentBufferSize on HttpClientHandler to chunk the data when sending it.

Try using a StringContent, ByteArrayContent or StreamContent (If the steam is seekable) as these will be able to calculate the length for you.

var content = new StringContent(json);

HttpResponseMessage response = await client.PostAsync(content);

The PostAsJsonAsync extension methods create ObjectContent under the hood which doesn't calculate the Content-Length and return false:

public class ObjectContent : HttpContent
{
    /* snip */

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

Thus will always fall back to chunking to the buffer size.