无法强制转换类型为'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'."}
我从这段代码中理解的是,您只是尝试将解析器的IgnoreSerializableAttribute设置为true。
1>你知道为什么必须这么做吗?如果你去掉它会有什么效果?我可以从Newton Doc中看到,将IgnoreSerializableAttribute设置为true将停止Newtonsoft。Json的行为不像微软的序列化器,而只是序列化公共属性。
你还需要那个吗?
2>当前SerializerSettings的类型是什么(我们只知道它不是默认的,所以你可能会在某个地方改变它?)你确定它仍然有IgnoreSerializableAttribute默认为false吗?如果是这样,您可能有方法使用实际类型访问此属性?
希望有所帮助
我设法通过使用较新版本的JSON来解决这个问题。