我希望我的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因为我仍处于原型设计阶段。当我能证明其可行时,会重构。
答案 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只是为了避免歧义。