2012-07-26 66 views
31

我想我的WEB API方法返回一個XML對象回調用應用程序。目前它只是將XML作爲字符串對象返回。這是否是否?如果是這樣,你如何告訴webapi get方法它返回一個XML類型的對象?WebAPI返回XML

感謝

編輯:Get方法的一個例子:

[AcceptVerbs("GET")] 
public HttpResponseMessage Get(int tenantID, string dataType, string ActionName) 
{ 
    List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData 
      ("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList(); 
    string AllResults = ""; 
    for (int i = 0; i < SQLResult.Count - 1; i++) 
    { 
     AllResults += SQLResult[i]; 
    } 
    string sSyncData = "<?xml version=\"1.0\"?> " + AllResults; 
    HttpResponseMessage response = new HttpResponseMessage(); 
    response.Content = new StringContent(sSyncData); 
    return response;   
} 

它有點哈克由於IM仍然處於原型階段。當我證明它可行時,會重構。

回答

28

如果您返回一個可序列化的對象,WebAPI將根據客戶端發送的Accept頭自動發送JSON或XML。

如果你返回一個字符串,你會得到一個字符串。

+0

大家好,方法返回的數據是動態的。情況A.正在返回一個實體列表。情況B.可以是2個或更多實體/類的組合的列表。我希望有它的動態,但愚蠢的WebAPI到返回XML(如果還可以返回JSON格式比這將是很酷,但XML是主要neccessity) – Matt 2012-07-26 04:20:13

+0

然後創建一種對象,可以包含您想要的數據,並返回那。 – 2012-07-26 04:35:03

+2

確保你在對象上指定了[Serializable()],我最初錯過了這個。 – 2013-06-06 14:04:29

14

你應該簡單地返回你的對象,而不應該關心它的XML或JSON。從web api請求JSON或XML是客戶的責任。例如,如果您使用Internet Explorer撥打電話,則所請求的默認格式爲Json,Web API將返回Json。但是,如果您通過谷歌瀏覽器發出請求,則默認請求格式爲XML,您將返回XML。

如果使用Fiddler發出請求,則可以將Accept標頭指定爲Json或XML。

Accept: application/xml 

您可能想看看這篇文章:而不是將其轉換爲XML字符串

簡單的返回列表,:Content Negotiation in ASP.NET MVC4 Web API Beta – Part 1

編輯:根據你的編輯問題的代碼。嘗試使用提琴手。

public List<string> Get(int tenantID, string dataType, string ActionName) 
    { 
     List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList(); 
     return SQLResult; 
    } 

例如,如果你的列表是這樣的:

List<string> list = new List<string>(); 
list.Add("Test1"); 
list.Add("Test2"); 
list.Add("Test3"); 
return list; 

,並指定Accept: application/xml輸出將是:

<ArrayOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <string>Test1</string> 
    <string>Test2</string> 
    <string>Test3</string> 
</ArrayOfstring> 

,如果你指定 '接受:應用/ JSON' 在請求輸出將是:

[ 
    "Test1", 
    "Test2", 
    "Test3" 
] 

因此,讓客戶端請求內容類型,而不是發送定製的xml。

+0

所以我目前的自定義建設API的get方法中的XML只是一個串聯的字符串,而不是返回該字符串。那麼,除此之外,還有什麼需要做的? – Matt 2012-07-26 03:58:54

+0

閱讀評論貼在voltagex的文章 – Matt 2012-07-26 04:20:30

+0

@Raven,你能否在你的問題中發佈你的方法簽名或相關C#代碼的一部分? – Habib 2012-07-26 04:24:07

62

如果您不希望控制器決定返回對象類型,則應將方法返回類型設置爲System.Net.Http.HttpResponseMessage,並使用以下代碼返回XML。

public HttpResponseMessage Authenticate() 
{ 
    //process the request 
    ......... 

    string XML="<note><body>Message content</body></note>"; 
    return new HttpResponseMessage() 
    { 
    Content = new StringContent(XML, Encoding.UTF8, "application/xml") 
    }; 
} 

這是始終從Web API返回XML的最快捷方式。

+9

人們常常回答要聰明。我希望答案很簡單,直接解決手頭的問題。我有XML的字符串。我想返回XML。答對了!感謝這個答案。 – Kevin 2015-05-08 19:46:44

18

下面是與IHttpActionResult返回類型兼容的另一種方法。在這種情況下,我要求它使用XML序列(可選),而不是數據合同串行器,我使用return ResponseMessage(讓我得到IHttpActionResult兼容的回報:

return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK) 
     { 
      Content = new ObjectContent<SomeType>(objectToSerialize, 
       new System.Net.Http.Formatting.XmlMediaTypeFormatter { 
        UseXmlSerializer = true 
       }) 
     }); 
+0

這就是我正在尋找的方式。謝謝你AaronLS – Shahdat 2016-01-28 19:09:28

+1

很好的答案,謝謝。確保'SomeType'有一個默認的構造函數,或者你得到一個無用的錯誤*「...配置的格式化程序'System.Web.Http.Tracing.Tracers.XmlMediaTypeFormatterTracer'不能寫入一個類型的對象...」* – Dunc 2016-03-16 09:53:27

+2

你可以只需編寫'Content(System.Net.HttpStatusCode.OK,model,Configuration.Formatters.XmlFormatter)'。 – kokosda 2016-04-28 23:57:54