32

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?

kiewic
  • 15,852
  • 13
  • 78
  • 101
dontbesorry80
  • 567
  • 1
  • 6
  • 12

2 Answers2

28

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.

Kevin Smith
  • 13,746
  • 4
  • 52
  • 77
3

You can still use JsonContent in combination with LoadIntoBufferAsync, check out this answer. Example:

var content = JsonContent.Create(someObject);
await content.LoadIntoBufferAsync();
HttpResponseMessage response = await _httpClient.PutAsync($"/endpoint", content);
Maksim Ramanovich
  • 581
  • 1
  • 6
  • 22
  • This does NOT work if you use .PostAsJsonAsync(), instead of PutAsync()/PostAsync(). @kevin-smith pointed this out in his post. – Cryptc Sep 13 '22 at 21:35
  • This also does NOT work if you include `JsonContent` in `MultipartFormDataContent` in .NET 6 – Mr Patience Oct 15 '22 at 07:59