Web Api调用不在JSON响应中返回__type

时间:2012-11-06 15:27:43

标签: c# .net asp.net-mvc-3 wcf asp.net-web-api

我们有一个MVC网站正在调用WCF Restful服务,但我们现在用Web Api调用替换它们。问题是某些MVC控制器中的现有代码依赖于为JSON中的每个对象返回的“__type”属性,因此它可以根据对象的类型执行不同的操作。

但是,在新的Web Api响应中,返回的每个对象在JSON中都没有“__type”条目,因此代码失败。

有谁知道这是怎么做的?我发现很多关于删除WCF服务的__type条目但还没有确定它们是否适用于Web Api。

2 个答案:

答案 0 :(得分:4)

__type字段是DataContractJaonSerializer(DCJS)的一个功能,特别是它适用于ASP。与应用了enableWebScript行为配置的端点的.NET AJAX兼容性。更具体地说,通过将DataContractSerilizerSettings::EmitTypeInformation属性设置为AsNeededAlways来控制此功能。

开箱即用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,但它仍然适用于我。