【问题标题】:Is it possible to use Newtonsoft.Json when using HttpClient.PostAsJsonAsync(something)?使用 HttpClient.PostAsJsonAsync(something) 时是否可以使用 Newtonsoft.Json?
【发布时间】:2020-08-05 16:00:41
【问题描述】:

假设我想像这样添加一个键入的HttpClient

services.AddHttpClient<ISomeService, SomeService>(c =>
{
    c.BaseAddress = new Uri(someUrl);
});

发送请求时是否可以强制它使用Newtonsoft.Json进行序列化?最好以类似的方式为控制器添加它:

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });

所以当我像这样使用HttpClient 实例时:await httpClient.PostAsJsonAsync(testDto)Newtonsoft.Json 序列化器被使用而不是内置的。

编辑:刚刚注意到我使用的PostAsJsonAsync(...)GetFromJsonAsync(...)System.Net.Http.Json 中定义的扩展方法,这基本上使整个问题无效。

【问题讨论】:

  • 是的,阅读标题我的第一个想法是“世界上到底是什么类型的HttpClient”?您正在做的是添加一个输入的包装器,实际的 HttpClient 实例仍然只是一个普通的实例——顺便说一句,它与所有其他“输入的 HttpClient”映射共享。
  • 问题令人困惑,但他基本上问的是在HttpClientExtensions 命名空间中,如何为PostAsJsonAsyncReadAsAsync 方法设置默认序列化程序。
  • @Slowacki,这正是我所说的,一个共享HttpClient,以及每种类型的一大堆映射到不同的代表。没有“输入HttpClient”这样的东西。
  • @Andy 是的,这主要是关于:) 对不起,我会试着澄清一下这个问题。

标签: c# .net-core json.net


【解决方案1】:

如果您想使用Newtonsoft.Json,请使用System.Net.Http.HttpClientExtensions namespace

如果您想使用新的System.Text.Json,请使用System.Net.Http.Json.HttpClientJsonExtensions namespace

【讨论】:

  • 是的,我正在这样做,我的控制器似乎利用了例如JsonProperty 添加到我的 DTO 的某些属性中。但是,我注意到在使用 await _httpClient.PostAsJsonAsync(testDto) 时,会使用内置序列化程序 (System.Net.Http.Json)。因此问题。
  • @Slowacki -- 如果你查看源代码,看起来它仍然被硬编码为Newtonsoft.Json...我不相信有办法改变这一点,至少我从来没有见过方法。
  • @Slowacki -- 我更新了我的答案。您可以编写自己的扩展,使用您想要的任何序列化程序。这就是扩展的美妙之处。
  • 是的,刚刚注意到它只是System.Net.Http.Json 的扩展。我的错!
  • @Slowacki -- whew -- 我知道我们迟早会到达那里 :)
猜你喜欢
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多