【问题标题】:HttpClient PostAsJsonAsync incompatible with Newtonsoft.JsonHttpClient PostAsJsonAsync 与 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 代码行上收到 stackOverflow 错误。 删除Newtonsoft,问题就解决了。

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

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

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

我怀疑 Newtonsoft 中可能存在错误

【问题讨论】:

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

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


【解决方案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://stackoverflow.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)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多