2012-11-06 51 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%向後兼容的人。 –