HttpClient PostAsJsonAsync 与 Newtonsoft.Json 不兼容

Cru*_*ler 5 c# json json.net dotnet-httpclient

我刚刚在 winforms 应用程序中发现的东西

我的应用程序对 Web Api 服务进行 http 调用,如下所示

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;
Run Code Online (Sandbox Code Playgroud)

没什么特别的,但是一旦你通过 nuget 安装 Newtonsoft.Json (V6.0.3)

突然我在 HttpResponseMessage 代码行上收到 stackOverflow 错误。删除Newtonsoft,问题就解决了。

问题是我要使用该库在表单中的其他位置序列化/反序列化数据

我的解决方法是使用不同的库,我只是使用 System.Runtime.Serialization.Json;但这仍然很奇怪,不是吗?

我还应该补充一点,这是 dotnet v4.0(不是 4.5),我的应用程序是一个在 MsWord 中作为附加组件运行的 VSTO COM 对象

我怀疑 Newtonsoft 可能存在错误

Amb*_*ung 6

如果您需要的只是方法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);
    }
}
Run Code Online (Sandbox Code Playgroud)

从此答案修改:/sf/answers/2836805611/


小智 3

从 nuget 安装“microsoft asp.net web api 2.2 客户端库”,不要手动引用 system.net.http.dll 和 system.net.http.formatting.dll。如果您安装此软件包,那么也会安装正确的 json.net