使用 api 控制器时的文件下载问题
使用 api 控制器时的文件下载问题
在ASP.NET MVC应用程序中,我有以上的代码用于下载文件。由于我的控制器继承自Controller,所以它运行良好。但是当我将这段代码移到WebAPI控制器时,它在return File处抛出错误。经过分析,我发现我的WebAPI控制器继承自ApiController(system.web.http.api controller),而ApiController中没有File类。是否有任何方法在WebAPI控制器中实现文件下载功能?
我尝试了以下替代代码在WebAPI控制器中,但是在调用它后无法看到下载文件。
public HttpResponseMessage DownloadConstructedXmlFile() { var result = new HttpResponseMessage(HttpStatusCode.OK); string xmlContent = "My test xml data"; //var serializer = new XmlSerializer(typeof(xmlContent)); var builder = new StringBuilder(); using (var writer = new StringWriter(builder)) { // serializer.Serialize(writer, xmlContent); result.Content = new StringContent(xmlContent, Encoding.UTF8, "application/xml"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = string.Format("test.xml") }; // return result; } return new HttpResponseMessage(); }
附:我正在尝试使用AngularJS代码通过Angular服务调用此API。这是在点击下载按钮时调用的。任何样例Angular代码、API控制器代码的帮助或建议都将很有帮助。
问题出现的原因是:在使用API控制器返回XML文件时,无法正确地下载文件到本地系统。
解决方法是:
1. 在控制器中返回一个XDocument对象,代码如下:
public XDocument returnXMLFile() { var xDoc = XDocument.Load("test.xml"); return xDoc; }
2. 修改GlobalConfiguration.Configuration.Formatters,使其返回XML,或者配置客户端设置accept header为"application/xml"。
3. 配置服务器以返回XML而不是其他类型(如JSON),代码如下:
var xml = new System.Net.Http.Formatting.XmlMediaTypeFormatter(); xml.MediaTypeMappings.Add(new QueryStringMapping("format", "xml", "application/xml")); GlobalConfiguration.Configuration.Formatters.Add(xml);
4. 使用超链接下载XML文件,代码如下:
Download XML
以上就是解决该问题的方法。如果想自定义下载文件的方式,可以参考以下关于使用AngularJS下载文件的问题:
- [Download file from a ASP.NET Web API method using angularjs](https://stackoverflow.com/q/24080018/261542)
- [download csv file from web api in angular js](https://stackoverflow.com/q/20300547/261542)
希望以上解决方法能对您有所帮助。