2011-07-21 33 views
5

我有一組服務用WCF Web Api託管,我使用JavaScript從JSON與它們進行通信。在大多數情況下,我可以修改標頭的接受位,以便要求JSON響應,但在某些情況下,我無法執行此操作。這是由於我正在使用的JavaScript框架(Ext JS)。對於某些事情,它只允許我指定一個URL而不是代理默認值,例如標題。在WCF Web Api中設置默認響應類型

但是,這不是一個Ext JS問題。 Web Api似乎默認返回XML,我想知道是否可以更改此默認值,以便它可以返回JSON。提前致謝!

+0

什麼是當你不能改變它的默認Accept頭值設置爲? – hskan

回答

1

根據代碼,如果WCF Web API在可用格式化程序的集合中,它將始終默認爲XmlFormatter。如果不存在,則使用JsonFormatter。還有一個DefaultFormatter屬性,但它是內部的,所以你不能設置它。也許一個有用的功能要求添加?

2

您可以使用代理通道,如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,瞭解如何使其運行。

+0

Glenn Block自己提供了一個委託渠道的更簡明示例和上述問題的解決方案:[http://codepaste.net/wehh49](http://codepaste.net/wehh49) –

4

一些實驗似乎表明配置的格式化程序的命令很重要(這非常直觀)。

默認情況下,當您創建的HttpConfiguration一個實例,其Formatters集合包含這些格式化:

  1. XmlMediaTypeFormatter
  2. JsonValueMediaTypeFormatter
  3. JsonMediaTypeFormatter
  4. FormUrlEncodedMediaTypeFormatter

原因w^hy XML是默認的格式,因爲它是第一個格式化程序。爲了使JSON默認值,你可以重新排序集合看起來像這樣:

  1. JsonValueMediaTypeFormatter
  2. JsonMediaTypeFormatter
  3. XmlMediaTypeFormatter
  4. FormUrlEncodedMediaTypeFormatter

給定一個實例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上工作。

3

我實際上找到了一個處理這個問題的簡單方法。首先確保默認的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"));