Skip to main content
 首页 » 编程设计

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

2024年02月02日28java哥

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

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

有人知道这是怎么做到的吗?我发现了很多有关删除 WCF 服务的 __type 条目的信息,但还没有找到关于确保它们适用于 Web Api 的信息。

请您参考如下方法:

__type 字段是 DataContractJaonSerializer (DCJS) 的一个特性,特别是它用于 ASP。 NET AJAX 兼容性,适用于配置了 enableWebScript 行为的端点。更具体地说,通过将 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并很容易地调整它以适应这种特定情况。