我们有一个最近被移动到新服务器的WEB API项目。在对其项目进行一些补充之后,我正在运行我的项目。有效载荷,但它突然抛出以下错误:
无法投射类型的对象 ' System.Net.Http.Formatting.JsonContractResolver'输入 ' 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);
Edit2:我们现在正在运行.NET 4.5。据我所知,我们之前跑过4.2,但看到它已经过了几个月,我无法确定。
根据Dominick的评论,我尝试将强制转换为DefaultContractResolver更改为:
var contractResolver =
(IContractResolver)serializerSettings.ContractResolver;
然而,这会在API中返回以下错误:
{"Message":"The requested resource does not support http method 'GET'."}
答案 0 :(得分:5)
我从这段代码中了解到,您只是尝试将解析器的IgnoreSerializableAttribute设置为true。
1&GT;你知道为什么要这么做吗?如果你删除它有什么影响? 我可以从Newton Doc看到将IgnoreSerializableAttribute设置为true将阻止Newtonsoft.Json表现得像Microsoft的序列化器,而只是序列化公共属性。
你还需要吗?
2 - ;你当前的SerializerSettings的类型是什么(我们只知道它不是默认的,所以你可能在某处更改它?)你确定它默认仍然有IgnoreSerializableAttribute为false吗?如果是这样,您可能有办法使用实际类型来获取此属性?
希望有所帮助
答案 1 :(得分:2)
我设法通过使用更新版本的JSON.NET解决了这个问题(8,在我们使用版本6之前)。这解决了错误。