2013-03-25 52 views
0

如何在Web API控制器中配置操作以返回XML而不是JSON?如何從Web API操作返回Xml而不是JSON?

我有,它返回其具有的XmlElement屬性一個用戶配置對象的動作:

[HttpGet] 
     public UserProfile SearchByEmail(string siteName, string email) 
     { 
      var userProfile = this._profileFinderByEmail.Find(siteName, email); 

      if (userProfile == null) 
      { 
       throw new HttpResponseException(HttpStatusCode.NotFound); 
      } 

      return userProfile; 
     } 

噹噹我運行這個動作,它返回應用/ JSON而非XML。我怎樣才能返回XML?

由小提琴手來看,我將派遣有以下Accept頭密鑰的請求頭:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

,我希望它返回的XML,但事實並非如此。

如何解決?

我也設置在WebApiConfig類以下值:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true; 

從鍍鉻/網絡選項卡瀏覽,我可以看到下面的錯誤:

Status Code:406 Not Acceptable 
+0

你確定,你的控制器接口到'ApiController'? – Sandy 2013-03-25 10:00:58

+0

是的我的控制器從ApiController繼承。 – 2013-03-25 11:05:51

回答

1

標題看起來是正確的,所以首先你應該檢查格式化程序是否存在。您可以輸出所有註冊格式化用下面的代碼片斷(您可以使用它裏面的操作方法):

foreach (var formatter in GlobalConfiguration.Configuration.Formatters) 
{ 
    System.Diagnostics.Debug.WriteLine(String.Format("{0}: {1}", formatter.GetType().Name, String.Join(", ", formatter.SupportedMediaTypes.Select(x=>x.MediaType)))); 
} 

結果將是可見的輸出的窗口的Visual Studio(設置爲從顯示輸出調試)。你應該尋找一行:

XmlMediaTypeFormatter: application/xml, text/xml 

如果它不存在那麼就意味着它在某種程度上刪除,你需要找到的代碼在您的應用程序的一部分。如果它在那裏,那很可能意味着DataContractSerializer無法序列化您的實體(您可以閱讀更多關於支持的類型here)。

您還提到您在實體中使用了XmlElement屬性。默認XmlMediaTypeFormatter使用DataContractSerializer(如上所述),它將忽略這些屬性。如果你想切換到XmlSerializer,您可以使用以下(在你的Global.asax例如)代碼:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true; 

當然XmlSerializer有自己的一套,你需要了解的侷限性。

+0

謝謝。我已經看到XmlMediaTypeFormatter:application/xml,text/xml存在,而JSON不存在。調試器在global.ascx文件中沒有中斷也很奇怪。 – 2013-03-25 10:54:03

+0

它給了我這個錯誤:狀態碼:406不可接受 – 2013-03-25 10:58:40

+1

@TheLight HTTP錯誤406(不可接受)表示沒有找到合適的格式化程序(沒有格式化程序用於此類接受標頭或格式化程序無法格式化該實體)。你可以閱讀更多[這裏](http://www.asp.net/web-api/overview/formats-and-model-binding/content-negotiation)。 – tpeczek 2013-03-25 11:06:25