我们有一个最近被移动到新服务器的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;
}
Run Code Online (Sandbox Code Playgroud)
我相信这段代码是因为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);
Run Code Online (Sandbox Code Playgroud)
Edit2:我们现在正在运行.NET 4.5.据我所知,我们之前跑过4.2,但看到它已经过了几个月,我无法确定.
根据Dominick的评论,我尝试将强制转换为DefaultContractResolver更改为:
var contractResolver =
(IContractResolver)serializerSettings.ContractResolver;
Run Code Online (Sandbox Code Playgroud)
但是,这会在API中返回以下错误:
{"Message":"The requested resource does not support http method 'GET'."}
我从这段代码中理解的是,您只是尝试将解析器的IgnoreSerializableAttribute设置为true.
1>你知道为什么要这么做吗?如果你删除它有什么影响?我可以从Newton Doc中看到,将IgnoreSerializableAttribute设置为true将阻止Newtonsoft.Json表现得像Microsoft的序列化器,而只是序列化公共属性.
你还需要吗?
2>您当前的SerializerSettings的类型是什么(我们只知道它不是默认类型,所以您可能在某处更改它?)您确定默认情况下仍然将IgnoreSerializableAttribute设置为false吗?如果是这样,您可能有办法使用实际类型来达到此属性?
希望能帮助到你
| 归档时间: |
|
| 查看次数: |
450 次 |
| 最近记录: |