如何从MVC控制器返回XML数据?(Visual Studio 2015环境)
嘿,我来帮你解决这个问题!在Visual Studio 2015的MVC项目里返回XML数据,你之前用XmlResult没成功,大概率是因为默认MVC框架并没有内置XmlResult这个类型——它不是原生的ActionResult子类,所以得自己定义或者换其他方法。下面给你几种靠谱的实现方式:
方法一:自定义XmlResult类(推荐用于重复场景)
如果你想像用JsonResult那样方便地返回XML,最好自己封装一个XmlResult,这样可以在多个控制器里复用。代码如下:
public class XmlResult : ActionResult { private readonly object _data; private readonly string _contentType; public XmlResult(object data) : this(data, "application/xml") { } public XmlResult(object data, string contentType) { _data = data; _contentType = contentType; } public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException(nameof(context)); var response = context.HttpContext.Response; response.ContentType = _contentType; if (_data != null) { var serializer = new XmlSerializer(_data.GetType()); using (var writer = new StringWriter()) { serializer.Serialize(writer, _data); response.Write(writer.ToString()); } } } }
之后在控制器里就可以直接用了:
public ActionResult GetXmlData() { var yourDataObject = new YourModel { Property1 = "Value1", Property2 = 123 }; return new XmlResult(yourDataObject); }
方法二:用ContentResult直接返回XML字符串(简单快捷)
如果只是单次使用,不想自定义类,可以先把对象序列化成XML字符串,再通过ContentResult返回,指定正确的内容类型:
public ActionResult ReturnXml() { var model = new YourModel { Name = "Test", Id = 456 }; var serializer = new XmlSerializer(typeof(YourModel)); string xmlString; using (var sw = new StringWriter()) { serializer.Serialize(sw, model); xmlString = sw.ToString(); } return Content(xmlString, "application/xml"); }
这种方式不需要额外定义类,适合临时需求。
方法三:用FileResult返回XML文件流(适合大数据)
如果你的XML数据量比较大,或者需要让用户下载XML文件,可以用FileResult返回流:
public ActionResult DownloadXml() { var model = new YourLargeModel(); var serializer = new XmlSerializer(typeof(YourLargeModel)); var memoryStream = new MemoryStream(); serializer.Serialize(memoryStream, model); memoryStream.Position = 0; // 重置流位置到开头 return File(memoryStream, "application/xml", "data.xml"); }
这样用户访问这个Action时,会直接下载名为data.xml的文件。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

