无法强制转换类型为'System.Net.Http.Formatting.JsonContractResolve

本文关键字:System Net Http JsonContractResolve Formatting 转换 类型 | 更新日期: 2023-09-27 18:05:20

我们有一个最近被转移到新服务器的WEB API项目。我正在运行我的项目后,使一些添加到它的有效载荷,但它突然抛出以下错误:

无法强制转换类型的对象"System.Net.Http.Formatting。JsonContractResolver' to type"Newtonsoft.Json.Serialization.DefaultContractResolver"。

有问题的代码行在global.asax:

  protected void Application_Start() {
        GlobalConfiguration.Configure(WebApiConfig.Register);
        var serializerSettings =
         GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
        var contractResolver =
           (DefaultContractResolver)serializerSettings.ContractResolver;
           contractResolver.IgnoreSerializableAttribute = true;
     }

我认为添加这段代码是因为API的默认输出是XML,而我们需要它是JSON。

突出显示(DefaultContractResolver)会显示一个工具提示,表明它引用了NewtonSoft.JSon.Serialization.DefaultContractResolver。突出serializersettings。ContractResolver引用IContractResolver JSonSerializerSettings.ContractResolver

代码在这台机器上已经有一段时间了,我唯一能想到的就是安装了一个新版本的。net。

什么会导致这行代码突然抛出错误?我该如何解决呢?

谢谢!

编辑:根据评论中的要求,我的序列化代码由以下内容组成:

json += "{'"employeename'": '"" + Convert.ToString(reader["Employee"])
+ "'"},";
return JsonConvert.DeserializeObject<OrgChartModel>(json);
我们现在运行的是。net 4.5。据我所知,我们之前运行了4.2,但看到它已经过去几个月了,我不能确定。

根据Dominick的评论,我尝试将转换为DefaultContractResolver更改为以下内容:

            var contractResolver =
          (IContractResolver)serializerSettings.ContractResolver;

但是,这最终会在API中返回以下错误:

{"Message":"The requested resource does not support http method 'GET'."}

无法强制转换类型为'System.Net.Http.Formatting.JsonContractResolve

我从这段代码中理解的是,您只是尝试将解析器的IgnoreSerializableAttribute设置为true。

1>你知道为什么必须这么做吗?如果你去掉它会有什么效果?我可以从Newton Doc中看到,将IgnoreSerializableAttribute设置为true将停止Newtonsoft。Json的行为不像微软的序列化器,而只是序列化公共属性。

你还需要那个吗?

2>当前SerializerSettings的类型是什么(我们只知道它不是默认的,所以你可能会在某个地方改变它?)你确定它仍然有IgnoreSerializableAttribute默认为false吗?如果是这样,您可能有方法使用实际类型访问此属性?

希望有所帮助

我设法通过使用较新版本的JSON来解决这个问题。

. NET(8,之前我们使用版本6)。