56

我希望我的 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,因为我仍处于原型设计阶段。当我可以证明它是可行的时会重构。

4

5 回答 5

112

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

于 2014-04-14T09:00:15.360 回答
49

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

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

于 2012-07-26T04:06:35.050 回答
29

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

return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK)
       {
           Content = new ObjectContent<SomeType>(objectToSerialize, 
              new System.Net.Http.Formatting.XmlMediaTypeFormatter { 
                  UseXmlSerializer = true 
              })
       });
于 2014-04-22T15:08:38.803 回答
21

您应该简单地返回您的对象,而不应该关心它是 XML 还是 JSON。从 web api 请求 JSON 或 XML 是客户端的责任。例如,如果您使用 Internet Explorer 进行调用,则请求的默认格式为 Json,而 Web API 将返回 Json。但是如果你通过谷歌浏览器发出请求,默认的请求格式是 XML,你会得到 XML。

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

Accept: application/xml

您可能想看这篇文章: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;
     }

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

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。

于 2012-07-26T03:43:07.500 回答
1

在我的 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 的明确而干净的方法,并且很容易添加到您现有的代码中。

PS 我使用完全限定名称 Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter 只是为了避免歧义。

于 2019-11-21T11:05:10.223 回答