加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

如何从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()) };
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读