我有一組服務用WCF Web Api託管,我使用JavaScript從JSON與它們進行通信。在大多數情況下,我可以修改標頭的接受位,以便要求JSON響應,但在某些情況下,我無法執行此操作。這是由於我正在使用的JavaScript框架(Ext JS)。對於某些事情,它只允許我指定一個URL而不是代理默認值,例如標題。在WCF Web Api中設置默認響應類型
但是,這不是一個Ext JS問題。 Web Api似乎默認返回XML,我想知道是否可以更改此默認值,以便它可以返回JSON。提前致謝!
我有一組服務用WCF Web Api託管,我使用JavaScript從JSON與它們進行通信。在大多數情況下,我可以修改標頭的接受位,以便要求JSON響應,但在某些情況下,我無法執行此操作。這是由於我正在使用的JavaScript框架(Ext JS)。對於某些事情,它只允許我指定一個URL而不是代理默認值,例如標題。在WCF Web Api中設置默認響應類型
但是,這不是一個Ext JS問題。 Web Api似乎默認返回XML,我想知道是否可以更改此默認值,以便它可以返回JSON。提前致謝!
根據代碼,如果WCF Web API在可用格式化程序的集合中,它將始終默認爲XmlFormatter。如果不存在,則使用JsonFormatter。還有一個DefaultFormatter屬性,但它是內部的,所以你不能設置它。也許一個有用的功能要求添加?
您可以使用代理通道,如http://blog.alexonasp.net/post/2011/07/26/Look-Ma-I-can-handle-JSONP-(aka-Cross-Domain-JSON)-with-WCF-Web-API-and-jQuery!.aspx所述,它將URI如http://myserver/myresource/1/json映射到http://myserver/myresource/1,並將accept頭設置爲application/json。
當您從http://wcf.codeplex.com下載WCF Web API時,委派渠道是ContactManager_Advanced示例的一部分。
它包含在UriFormatExtensionMessageChannel.cs文件中。
查看示例的global.asax.cs,瞭解如何使其運行。
Glenn Block自己提供了一個委託渠道的更簡明示例和上述問題的解決方案:[http://codepaste.net/wehh49](http://codepaste.net/wehh49) –
一些實驗似乎表明配置的格式化程序的命令很重要(這非常直觀)。
默認情況下,當您創建的HttpConfiguration
一個實例,其Formatters
集合包含這些格式化:
原因w^hy XML是默認的格式,因爲它是第一個格式化程序。爲了使JSON默認值,你可以重新排序集合看起來像這樣:
給定一個實例HttpConfiguration的config
,這裏的一種重新排列集合的方法:
var jsonIndex = Math.Max(
config.Formatters.IndexOf(config.Formatters.JsonFormatter),
config.Formatters.IndexOf(config.Formatters.JsonValueFormatter));
var xmlIndex = config.Formatters.IndexOf(
config.Formatters.XmlFormatter);
config.Formatters.Insert(jsonIndex + 1, config.Formatters.XmlFormatter);
config.Formatters.RemoveAt(xmlIndex);
不管這是否支持我不知道,但它似乎在WebApi 0.6.0上工作。
我實際上找到了一個處理這個問題的簡單方法。首先確保默認的JSON格式化程序是第一個。然後將其類型設置爲text/html。這將確保瀏覽器獲取JSON,即使它沒有設置標題。下面的好方面是你永遠不必記得在客戶端代碼中設置accept頭。它只是工作,並始終默認爲JSON。
var jsonformatter = config.Formatters.Where(t => t.GetType() == typeof(JsonMediaTypeFormatter)).FirstOrDefault());
config.Formatters.Remove(jsonformatter);
config.Formatters.Insert(0, jsonformatter);
config.Formatters[0].SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
什麼是當你不能改變它的默認Accept頭值設置爲? – hskan