HttpClient PostAsJsonAsync 与 Newtonsoft.Json 不兼容

Posted

技术标签:

【中文标题】HttpClient PostAsJsonAsync 与 Newtonsoft.Json 不兼容【英文标题】:HttpClient PostAsJsonAsync incompatible with Newtonsoft.Json 【发布时间】:2014-07-24 16:57:27 【问题描述】:

我刚刚在我的 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;

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

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

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

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

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

我怀疑 Newtonsoft 中可能存在错误

【问题讨论】:

如果堆栈溢出,堆栈上有什么?启用外部代码。 启用外部代码?你的意思是我应该获取 newtonsoft 源代码并允许在外部类库中调试?我现在就去寻找那个版本的源代码 抱歉,不清楚。我的意思是启用“显示外部代码”。堆栈跟踪窗口中的一个菜单选项。 谢谢。生病尝试得到那个。问题是它并不总是给我调试断点。这是一个 VSTO ms 单词插件,有时 ms 单词完全是 crokes @Crudler 我猜你从来没有想过这个?我遇到了同样的错误,希望有一个解决方案,而不是不包括 Newtonsoft.Json 【参考方案1】:

如果您只需要PostAsJsonAsync 方法,您最好编写自己的扩展方法。

我建议删除对Microsoft.AspNet.WebApi.Client 的引用(当我从这个包中使用 PostAsJsonAsync 时,它抱怨它找不到旧版本的 Newtonsoft.Json,但问题是我需要最新版本。我的项目目标 .net 框架 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://***.com/a/40525794/2205372

【讨论】:

你为什么不用await JsonConvert.SerializeObjectAsync(theObj)【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

我刚试了一下,还是不行(.net framework 4.7.2)

以上是关于HttpClient PostAsJsonAsync 与 Newtonsoft.Json 不兼容的主要内容,如果未能解决你的问题,请参考以下文章

轻松把玩HttpClient之封装HttpClient工具类,插件式配置HttpClient对象

Httpclient4.5.*HttpClient请求,对于新建httpclient实例时保持会话

HttpClient学习整理

httpclient简介说明

httpClient 保持session

httpclient post