Ядро Asp.Net HttpClient получает ответ 411 длина требуется ошибка - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать службу, которая отправляет некоторые данные в конечную точку API с помощью C # HttpClient.Код выглядит следующим образом.

public class HttpClientService : IHttpClientService
{
    static HttpClient client = new HttpClient();

    public HttpClientService()
    {
        client.BaseAddress = new Uri("http://xx.xx.xx.xx/");
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }

    public async Task<Uri> MakeLogEntry(CnsLog log)
    {
        HttpResponseMessage response = await client.PostAsJsonAsync("api/logs", log);
        return response.Headers.Location;
    }

}

Проблема в том, что конечная точка возвращает ошибку 411 Требуемая длина.Я обнаружил, что это потому, что мой запрос не имеет установленного заголовка длины содержимого, что я нашел, чтобы быть правдой, когда я проверил запрос с помощью Fiddler.

Я попытался установить заголовок длины содержимого наклиент в конструкторе, но код не компилируется после этого.Я застрял и был бы признателен за любую помощь.Спасибо

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

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

PostAsJsonAsync - это удобный ярлык, который создает HttpContent из poco, создает HttpRequestMessage из этого содержимого и отправляет запрос POST.Удобно, но вся эта абстракция не дает вам возможности установить заголовки уровня запроса.Итак, вам нужно проделать еще немного работы, чтобы построить / отправить запрос:

var json = JsonConvert.SerializeObject(log);
var content = new StringContent(json, Encoding.UTF8, "application/json");
content.Headers.ContentLength = json.Length;
var response = await client.PostAsync("api/logs", content);
0 голосов
/ 18 сентября 2018

Также вы можете использовать HttpWebRequest.

byte[] postBytes = Encoding.ASCII.GetBytes(log);
request.ContentLength = postBytes.Length;

Пример запроса HttpWebRequest приведен ниже:

ASCIIEncoding encoder = new ASCIIEncoding();
byte[] data = encoder.GetBytes(serializedObject); // a json object, or xml, whatever...

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = data.Length;
request.Expect = "application/json";

request.GetRequestStream().Write(data, 0, data.Length);

HttpWebResponse response = request.GetResponse() as HttpWebResponse;
...