HttpClient PostAsJsonAsync несовместим с Newtonsoft.Json
Что-то, что я только что обнаружил в своем приложении winforms
Мое приложение выполняет HTTP-вызов веб-службы API следующим образом
HttpClient _client = new HttpClient();
_client.Timeout = new TimeSpan(0, 3, 0);
_client.BaseAddress = new Uri("http://Myserver/MyApp");
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = _client.PostAsJsonAsync("api/Addin", newObject).Result;
Ничего особенного, но как только вы установите Newtonsoft.Json (V6.0.3) через Nuget
внезапно я получаю ошибку stackOverflow в строке кода HttpResponseMessage. удалите Newtonsoft, и проблема решена.
Проблема в том, что я должен был использовать библиотеку для сериализации / десериализации данных в другом месте в моей форме
Мой обходной путь - использовать другую библиотеку, я просто использую System.Runtime.Serialization.Json; но это все еще действительно странно, нет?
Я должен также добавить, что это dotnet v4.0 (не 4.5), и мое приложение представляет собой VSTO COM-объект, работающий в MsWord в качестве надстройки.
Я подозреваю, что ошибка может быть в Newtonsoft
2 ответа
Если все, что вам нужно, это PostAsJsonAsync
метод, вам лучше написать свой собственный метод расширения.
Рекомендую удалить ссылку на Microsoft.AspNet.WebApi.Client
(когда я использую PostAsJsonAsync из этого пакета, он жалуется, что не может найти более старую версию Newtonsoft.Json, но дело в том, что мне нужна последняя версия. Мой проект нацелен на.net framework 4.7.2) в любом случае...
Вот код, который вы можете скопировать и вставить.
Я использовал полностью определенные имена, поэтому вам не нужно беспокоиться о добавлении using
заявления.
Я также использую библиотеку Newtonsoft.Json для сериализации объекта.
public static class HttpClientExt
{
public static async System.Threading.Tasks.Task<HttpResponseMessage> PostAsJsonAsync<T>(this HttpClient client, string requestUrl, T theObj)
{
var stringContent = new StringContent(
Newtonsoft.Json.JsonConvert.SerializeObject(theObj),
System.Text.Encoding.UTF8, "application/json");
return await client.PostAsync(requestUrl, stringContent);
}
}
Изменено из этого ответа: /questions/3989467/httpclient-ne-podderzhivaet-metod-postasjsonasync-c/3989479#3989479
Установите "клиентские библиотеки microsoft asp.net web api 2.2" из nuget и не обращайтесь к system.net.http.dll и system.net.http.formatting.dll вручную. Если вы установите этот пакет, то также установите правильный json.net
Я получил ошибку после обновления до новой версии пакета Newtonsoft.Json.
Удаление пакета слепков Microsoft.AspNet.WebApi.Client и его повторная установка после обновления до нового пакета Newtonsoft.Json решили эту проблему для меня.