Странное поведение в заголовке Content-Type HttpRequestMessage - PullRequest
1 голос
/ 12 марта 2019

Я пытался сделать HTTP-запрос POST с приложением / json в теле к внешнему веб-сервису из C # (.NET Core 2.2.104).

Я уже прочитал все подобные вопросы в SO инаписал этот код:

            SignXmlRequestDto requestBody = new SignXmlRequestDto(p12, model.SignCertPin, model.Data);
            string json = JsonConvert.SerializeObject(requestBody);

            var httpRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Post,
                RequestUri = ncanNodeUrl,
                Headers =
            {
                { HttpRequestHeader.ContentType.ToString(), "application/json" }
            },
                Content = new StringContent(JsonConvert.SerializeObject(json))
            };

            var response = await httpClient.SendAsync(httpRequestMessage);

            string responseString = await response.Content.ReadAsStringAsync();

Я получаю сообщение об ошибке от службы, оно говорит: "Недопустимый заголовок Content-Type. Пожалуйста, установите Content-Type на application / json" .Что здесь интересно, если я имитирую этот запрос от Почтальона, то все работает хорошо, и я получаю успешный ответ.enter image description here

Обновлено: как предложил @ Kristóf Toth, я изменил свой код на:

            var httpRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Post,
                RequestUri = ncanNodeUrl,
                Content = new StringContent(json, Encoding.UTF8, "application/json")
            };

            var response = await httpClient.SendAsync(httpRequestMessage);

            string responseString = await response.Content.ReadAsStringAsync();

, но все равно выдает мне то же сообщение об ошибке.

Ответы [ 2 ]

5 голосов
/ 12 марта 2019

Content-Type - это заголовок content . Это должно быть установлено на содержание, а не сам запрос. Это можно сделать с помощью StringContent (строка, кодировка, строка) конструктор:

Content = new StringContent(JsonConvert.SerializeObject(json),Encoding.UTF8, "application/json")

или установив свойство Headers.ContentType объекта StringContent:

var content=new StringContent(JsonConvert.SerializeObject(json));
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
3 голосов
/ 12 марта 2019

Это может быть проблема с кодировкой.Вы должны использовать JsonContent, а не StringContent, ИЛИ вы можете сделать нечто подобное:

// Serialize into JSON String
var stringPayload = JsonConvert.SerializeObject(payload);

// Wrap JSON StringContent which then can be used by the HttpClient class
var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...