Как отключить кодировку с передачей пакетов в ASP.Net С# с использованием HttpClient

Я пытаюсь опубликовать некоторый 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);
}

Но по-прежнему кажется, что Transfer-Encoding установлен на "chunked", когда я проверяю Fiddler.

Может кто-нибудь помочь с этим?

Ответ 1

Похоже, вам тоже нужно установить заголовок Content-Length, если вы не используете MaxRequestContentBufferSize для HttpClientHandler чтобы HttpClientHandler данные при отправке.

Попробуйте использовать StringContent, ByteArrayContent или StreamContent (если пар StreamContent для поиска), поскольку они смогут рассчитать длину для вас.

var content = new StringContent(json);

HttpResponseMessage response = await client.PostAsync(content);

PostAsJsonAsync расширения PostAsJsonAsync создают PostAsJsonAsync ObjectContent под капотом, который не вычисляет Content-Length и возвращает false:

public class ObjectContent : HttpContent
{
    /* snip */

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

Таким образом, всегда будет возвращаться к размеру буфера.