【发布时间】:2014-09-25 21:20:24
【问题描述】:
使用常规控制器,我可以通过返回 FileResult 来做到这一点。这似乎不适用于 ApiController。可以做到吗?这样做是正确的吗?
【问题讨论】:
-
Web API 用于 RESTful Web 服务。所以是的,它可以做到,这不是一个坏主意。
标签: asp.net-mvc-4
使用常规控制器,我可以通过返回 FileResult 来做到这一点。这似乎不适用于 ApiController。可以做到吗?这样做是正确的吗?
【问题讨论】:
标签: asp.net-mvc-4
试试这个。
[HttpGet]
public HttpResponseMessage Get()
{
var file = HttpContext.Current.Server.MapPath("~/Images/accent.png");
var stream = new FileStream(file, FileMode.Open);
var content = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StreamContent(stream)
};
content.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return content;
}
【讨论】:
The requested resource does not support http method 'GET'.
HttpGet 属性([HttpGet])。 @teenup
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web.Http;
namespace Web.Controllers
{
//usage: /download/report
[RoutePrefix("download")]
public class DownloadController : ApiController
{
[HttpGet("report")]
public HttpResponseMessage Report()
{
using (var service = new Client())
{
var report = service.BuildReport();
return DownloadResponse(report, "Report.csv");
}
}
private static HttpResponseMessage DownloadResponse(string content, string fileName)
{
var downloadContent = new StringContent(content);
var mediaType = new MediaTypeHeaderValue("application/octet-stream");
var disposition= new ContentDispositionHeaderValue("attachment") { FileName = fileName };
downloadContent.Headers.ContentType = mediaType;
downloadContent.Headers.ContentDisposition = disposition;
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = downloadContent
};
return result;
}
}
}
【讨论】: