簡體   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