繁体   English   中英

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

[英]Web Api call not returning __type in JSON response

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

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

有谁知道这是怎么做的? 我发现有很多关于删除WCF服务的__type条目的信息,但是对于确保它们是否包含在Web Api中还没有任何帮助。

__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实例,然后注册EmitTypeInformation以处理JSON媒体类型,而不是内置的JsonMediaTypeFormatter。 幸运的是自ASP。 NET Web API是开源的,您应该能够复制现有的实现并非常容易地对其进行调整以适合这种特定情况。

经过更多Google搜索后,我找到了答案。

在WebApi控制器项目侧,在Global App_Start函数中添加了:

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Objects;

然后在要反序列化的客户端C#端,我添加了:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.Objects;

因此,从本质上讲,它是序列化程序的TypeNameHandling.Objects设置,它将为每个对象输出$ type而不是__type,但是对我来说仍然可以使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM