2012-07-26 274 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