WebAPI返回XML

Mat*_*att 42 asp.net asp.net-mvc asp.net-web-api

我想要我的WEB API方法将XML对象返回给调用应用程序.目前它只是将XML作为字符串对象返回.这不是不是吗?如果是这样,你怎么告诉webapi get方法它返回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;          
}
Run Code Online (Sandbox Code Playgroud)

它有点hacky因为我仍处于原型设计阶段.当我证明其可行时,将重构.

小智 86

如果您不希望控制器决定返回对象类型,则应将方法返回类型设置为,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") 
  };
}
Run Code Online (Sandbox Code Playgroud)

这是始终从Web API返回XML的最快方法.

  • 人们经常回答是聪明的.我希望答案很简单,直接解决手头的问题.我有XML字符串.我想返回XML.答对了!谢谢你的回答. (14认同)
  • 这对我不起作用。我在浏览器中收到此消息 - 知道为什么吗?: StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StringContent, Headers: { Content-Type: application/xml; 字符集=utf-8 } (3认同)
  • 旁注:不要像我一样想知道为什么当您尝试使用新的 `StringContent` 对象返回 `Request.CreateResponse()` 时它不起作用。确保你正在返回一个 `new HttpResponseMessage()`。 (2认同)

Ada*_*ter 41

如果返回可序列化对象,WebAPI将根据客户端发送的Accept标头自动发送JSON或XML.

如果你返回一个字符串,你会得到一个字符串.

  • 确保在对象上指定[Serializable()],我最初错过了这个. (4认同)

Aar*_*nLS 21

这是与IHttpActionResult返回类型兼容的另一种方法.在这种情况下,我要求它使用XML Serializer(可选)而不是Data Contract序列化程序,我正在使用,return ResponseMessage(以便我获得与IHttpActionResult兼容的返回:

return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK)
       {
           Content = new ObjectContent<SomeType>(objectToSerialize, 
              new System.Net.Http.Formatting.XmlMediaTypeFormatter { 
                  UseXmlSerializer = true 
              })
       });
Run Code Online (Sandbox Code Playgroud)

  • 你可以写`Content(System.Net.HttpStatusCode.OK,model,Configuration.Formatters.XmlFormatter)`. (2认同)

Hab*_*bib 18

您应该只返回您的对象,而不应该关注它的XML或JSON.客户端负责从Web API请求JSON或XML.例如,如果使用Internet Explorer进行调用,则请求的默认格式为Json,Web API将返回Json.但是,如果您通过谷歌浏览器提出请求,则默认请求格式为XML,您将获得XML.

如果使用Fiddler发出请求,则可以将Accept标头指定为Json或XML.

Accept: application/xml
Run Code Online (Sandbox Code Playgroud)

您可能希望看到这篇文章:ASP.NET MVC4 Web API Beta中的内容协商 - 第1部分

编辑:根据您编辑的问题和代码:

简单的字符串返回列表,而不是将其转换为XML.尝试使用Fiddler.

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;
     }
Run Code Online (Sandbox Code Playgroud)

例如,如果您的列表如下:

List<string> list = new List<string>();
list.Add("Test1");
list.Add("Test2");
list.Add("Test3");
return list;
Run Code Online (Sandbox Code Playgroud)

并指定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>
Run Code Online (Sandbox Code Playgroud)

如果在请求中指定'Accept:application/json',则输出将为:

[
  "Test1",
  "Test2",
  "Test3"
]
Run Code Online (Sandbox Code Playgroud)

因此,让客户端请求内容类型,而不是发送自定义的xml.