I have a Web Api method which should return an xml data but it returns string:
public class HealthCheckController : ApiController { [HttpGet] public string Index() { var healthCheckReport = new HealthCheckReport(); return healthCheckReport.ToXml(); } }
It returns:
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/"> <myroot><mynode></mynode></myroot> </string>
and I have added this mapping:
config.Routes.MapHttpRoute( name: "HealthCheck", routeTemplate: "healthcheck", defaults: new { controller = "HealthCheck", action = "Index" });
How to make it return just the xml bits:
<myroot><mynode></mynode></myroot>
If I was using just MVC, I could be using the below but Web API doesn't support "Content":
[HttpGet] public ActionResult Index() { var healthCheckReport = new HealthCheckReport(); return Content(healthCheckReport.ToXml(), "text/xml"); }
I have also added the below codes to the WebApiConfig class:
config.Formatters.Remove(config.Formatters.JsonFormatter); config.Formatters.XmlFormatter.UseXmlSerializer = true;
If you don't want the controller to decide the return object type, you should set your method return type as System. Net. Http. HttpResponseMessage and use the below code to return the XML.
Data types that REST API can return are as follows: JSON (JavaScript Object Notation) XML.
If you want to send XML data to the server, set the Request Header correctly to be read by the sever as XML. xmlhttp. setRequestHeader('Content-Type', 'text/xml'); Use the send() method to send the request, along with any XML data.
The quickest way is this,
public class HealthCheckController : ApiController { [HttpGet] public HttpResponseMessage Index() { var healthCheckReport = new HealthCheckReport(); return new HttpResponseMessage() {Content = new StringContent( healthCheckReport.ToXml(), Encoding.UTF8, "application/xml" )}; } }
but it is also very easy to build a new XmlContent class that derives from HttpContent to support XmlDocument or XDocument directly. e.g.
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; } }
and you can use it just like you would use StreamContent or StringContent, except that it accepts a XmlDocument,
public class HealthCheckController : ApiController { [HttpGet] public HttpResponseMessage Index() { var healthCheckReport = new HealthCheckReport(); return new HttpResponseMessage() { RequestMessage = Request, Content = new XmlContent(healthCheckReport.ToXmlDocument()) }; } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With