HttpClient PostAsJsonAsync与Newtonsoft.Json不兼容

时间:2014-07-24 16:57:27

标签: c# json json.net dotnet-httpclient

我刚刚在winforms app中找到的东西

我的应用程序对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;

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

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

问题是我是使用库来序列化/反序列化我表单中其他地方的数据

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

我还应该补充一点,这是dotnet v4.0(不是4.5),我的应用程序是在MsWord中作为Add On

运行的VSTO COM对象

我怀疑牛顿软件中可能存在错误

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

我在更新到更新版本的Newtonsoft.Json软件包后收到错误。

卸载Microsoft.AspNet.WebApi.Client nugget包并在升级到较新的Newtonsoft.Json包后重新安装它解决了我的问题。

答案 2 :(得分:0)

如果只需要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);
    }
}

根据以下答案进行了修改:https://stackoverflow.com/a/40525794/2205372