用于返回XML的Web API

时间:2012-07-26 03:41:56

标签: 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;          
}

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

5 个答案:

答案 0 :(得分:80)

如果您不希望控制器决定返回对象类型,则应将方法返回类型设置为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的最快方法。

答案 1 :(得分:34)

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

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

答案 2 :(得分: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 
              })
       });

答案 3 :(得分:16)

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

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

Accept: application/xml

您可能希望看到这篇文章:Content Negotiation in ASP.NET MVC4 Web API Beta – Part 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;
     }

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

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>

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

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

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

答案 4 :(得分:0)

在带有netcore 2.2的项目中,我使用以下代码:

[HttpGet]
[Route( "something" )]
public IActionResult GetSomething()
{
    string payload = "Something";

    OkObjectResult result = Ok( payload );

    // currently result.Formatters is empty but we'd like to ensure it will be so in the future
    result.Formatters.Clear();

    // force response as xml
    result.Formatters.Add( new Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter() );

    return result;
}

它强制控制器中的一个动作返回一个xml而不影响其他动作。此外,此代码也不包含HttpResponseMessage或StringContent或ObjectContent(它们是可抛弃的对象),因此应适当处理(如果使用任何提醒您注意的代码分析器,这尤其是个问题)。

更进一步,您可以使用以下方便的扩展名:

public static class ObjectResultExtensions
{
    public static T ForceResultAsXml<T>( this T result )
        where T : ObjectResult
    {
        result.Formatters.Clear();
        result.Formatters.Add( new Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter() );

        return result;
    }
}

您的代码将如下所示:

[HttpGet]
[Route( "something" )]
public IActionResult GetSomething()
{
    string payload = "Something";

    return Ok( payload ).ForceResultAsXml();
}

此外,此解决方案看起来像一种强制将其返回为xml的显式且简洁的方法,并且很容易添加到现有代码中。

P.S。我使用标准名称Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter只是为了避免歧义。