我想在我的 ASP.Net Web API 控制器中返回一个文件,但我所有的方法都返回HttpResponseMessage为 JSON。
HttpResponseMessage
public async Task<HttpResponseMessage> DownloadAsync(string id) { var response = new HttpResponseMessage(HttpStatusCode.OK); response.Content = new StreamContent({{__insert_stream_here__}}); response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); return response; }
当我在浏览器中调用此端点时,Web APIHttpResponseMessage以 JSON 格式返回,并将 HTTP 内容标头设置为application/json.
application/json
如果这是 ASP.net-Core,那么您正在混合 Web API 版本。让操作返回派生的IActionResult,因为在您当前的代码中,框架将HttpResponseMessage其视为模型。
IActionResult
[Route("api/[controller]")] public class DownloadController : Controller { //GET api/download/12345abc [HttpGet("{id}")] public async Task<IActionResult> Download(string id) { Stream stream = await {{__get_stream_based_on_id_here__}} if(stream == null) return NotFound(); // returns a NotFoundResult with Status404NotFound response. return File(stream, "application/octet-stream"); // returns a FileStreamResult } }
笔记:
当响应完成时,框架将处理在这种情况下使用的流。如果使用using语句,则流将在响应发送之前被释放,并导致异常或损坏的响应。
using