2012-11-06 50 views
1

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

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

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

回答

1

我在google'ing之后找到了答案。

在的WebAPI控制器项目方,在全球App_Start功能我补充说:

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

,然后当我要反序列化的客户端C#的一面,我说:

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

所以基本上,它是TypeNameHandling.Objects设置的序列化器,它将为每个对象放置$ type而不是__type,但它仍然适用于我。

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子类,创建/配置其DCJS实例与EmitTypeInformation设置你想,然后注册一个处理JSON的媒体类型,而不是建立在JsonMediaTypeFormatter 。幸运的是,自ASP。 NET Web API是开源的,你应该能够复制the existing implementation并且很容易调整它以适应这个特定的情况。

+0

嗨德鲁,谢谢你的回答 - 我实际上最后自己设法回答了它(下面) - 客户端代码能够从JSON.NET中处理$ type,而不是__type,所以我为此付出了努力。 – trembler2003

+0

很高兴听到它。希望我的回答能够帮助那些可能需要保持100%向后兼容的人。 –