35

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

2 Answers 2

33
+50

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.

Sign up to request clarification or add additional context in comments.

Comments

8

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

3 Comments

This does NOT work if you use .PostAsJsonAsync(), instead of PutAsync()/PostAsync(). @kevin-smith pointed this out in his post.
This also does NOT work if you include JsonContent in MultipartFormDataContent in .NET 6
Yes, you can't use PostAsJsonAsync(). Instead you have to instantiate JsonContent, load the content to the buffer, and then pass it to PostAsync().

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.