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对象