我们有一个MVC网站正在调用WCF Restful服务,但我们现在用Web Api调用替换它们。问题是某些MVC控制器中的现有代码依赖于为JSON中的每个对象返回的“__type”属性,因此它可以根据对象的类型执行不同的操作。
但是,在新的Web Api响应中,返回的每个对象在JSON中都没有“__type”条目,因此代码失败。
有谁知道这是怎么做的?我发现很多关于删除WCF服务的__type条目但还没有确定它们是否适用于Web Api。
答案 0 :(得分:4)
__type
字段是DataContractJaonSerializer
(DCJS)的一个功能,特别是它适用于ASP。与应用了enableWebScript
行为配置的端点的.NET AJAX兼容性。更具体地说,通过将DataContractSerilizerSettings::EmitTypeInformation
属性设置为AsNeeded
或Always
来控制此功能。
开箱即用WebAPI必然会使用JSON.NET作为JSON媒体的格式化程序,虽然它确实支持具有TypeNameHandling
功能的类似概念,但它与DCJS不兼容。
现在您可以像这样轻松切换WebAPI以使用DCJS:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;
但是,这仍然无法帮助您,因为他们在这些情况下在内部创建的DCJS实例未配置EmitTypeInformatiom
,这意味着它们默认为None
。
因此,获得所需内容的唯一解决方案是编写自己的MediaTypeFormatter
子类,使用所需的EmitTypeInformation
设置创建/配置其DCJS实例,然后注册该子类以处理JSON媒体类型而不是内置的JsonMediaTypeFormatter。幸运的是,ASP。 NET Web API是开源的,您应该能够复制the existing implementation并轻松调整它以适应这种特定情况。
答案 1 :(得分:1)
我在更多谷歌之后找到了答案。
在WebApi控制器项目方面,我在Global App_Start函数中添加了:
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Objects;
然后在客户端C#端,当我即将反序列化时,我补充道:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.Objects;
基本上,它是序列化程序的TypeNameHandling.Objects设置,它将为每个对象而不是__type输出$ type,但它仍然适用于我。