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, как Add On

Я подозреваю, что ошибка в Newtonsoft

Ответ 1

Установите "microsoft asp.net web api 2.2 клиентские библиотеки" из nuget и не обращайтесь к файлам system.net.http.dll и system.net.http.formatting.dll вручную. Если вы установите этот пакет, то также установит правильный json.net

Ответ 2

У меня та же проблема! Я разрабатываю компонент dll, который будет использоваться из visual foxpro. Когда компонент использует PostAsJsonAsync, вы получаете ошибку "No se puede cargar el archivo o ensamblado" Newtonsoft.Json, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed 'ni una de Sus dependencias. El sistema no puede encontrar el archivo especificado.

Ответ 3

Если вам нужен PostAsJsonAsync метод 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);
    }
}

Изменено из этого ответа: fooobar.com/questions/37288/...

Ответ 4

Я получил ошибку после обновления до более новой версии пакета Newtonsoft.Json.

Удаление пакета самообслуживания Microsoft.AspNet.WebApi.Client и повторная установка его после обновления до нового пакета Newtonsoft.Json разрешили проблему для меня.