如何从Web API方法返回Xml数据?
发布时间:2020-12-14 22:24:14 所属栏目:资源 来源:网络整理
导读:我有一个Web Api方法,它应该返回一个xml数据,但它返回字符串: public class HealthCheckController : ApiController { [HttpGet] public string Index() { var healthCheckReport = new HealthCheckReport(); return healthCheckReport.ToXml(); } } 它返
我有一个Web Api方法,它应该返回一个xml数据,但它返回字符串:
public class HealthCheckController : ApiController { [HttpGet] public string Index() { var healthCheckReport = new HealthCheckReport(); return healthCheckReport.ToXml(); } } 它返回: <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/"> <myroot><mynode></mynode></myroot> </string> 我已经添加了这个映射: config.Routes.MapHttpRoute( name: "HealthCheck",routeTemplate: "healthcheck",defaults: new { controller = "HealthCheck",action = "Index" }); 如何使它只返回xml位: <myroot><mynode></mynode></myroot> 如果我只是使用MVC,我可以使用以下,但Web API不支持“内容”: [HttpGet] public ActionResult Index() { var healthCheckReport = new HealthCheckReport(); return Content(healthCheckReport.ToXml(),"text/xml"); } 我还将以下代码添加到WebApiConfig类中: config.Formatters.Remove(config.Formatters.JsonFormatter); config.Formatters.XmlFormatter.UseXmlSerializer = true; 解决方法
最快的方式是这样,
public class HealthCheckController : ApiController { [HttpGet] public HttpResponseMessage Index() { var healthCheckReport = new HealthCheckReport(); return new HttpResponseMessage() {Content = new StringContent( healthCheckReport.ToXml(),Encoding.UTF8,"application/xml" )}; } } 但是也很容易构建一个从HttpContent派生出来直接支持XmlDocument或XDocument的新的XmlContent类。例如 public class XmlContent : HttpContent { private readonly MemoryStream _Stream = new MemoryStream(); public XmlContent(XmlDocument document) { document.Save(_Stream); _Stream.Position = 0; Headers.ContentType = new MediaTypeHeaderValue("application/xml"); } protected override Task SerializeToStreamAsync(Stream stream,System.Net.TransportContext context) { _Stream.CopyTo(stream); var tcs = new TaskCompletionSource<object>(); tcs.SetResult(null); return tcs.Task; } protected override bool TryComputeLength(out long length) { length = _Stream.Length; return true; } } 您可以像使用StreamContent或StringContent一样使用它,除了它接受XmlDocument, public class HealthCheckController : ApiController { [HttpGet] public HttpResponseMessage Index() { var healthCheckReport = new HealthCheckReport(); return new HttpResponseMessage() { RequestMessage = Request,Content = new XmlContent(healthCheckReport.ToXmlDocument()) }; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |