小编典典

在 ASP.Net Core Web API 中返回文件

all

问题

我想在我的 ASP.Net Web API 控制器中返回一个文件,但我所有的方法都返回HttpResponseMessage为 JSON。

到目前为止的代码

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.


阅读 71

收藏
2022-07-18

共1个答案

小编典典

如果这是 ASP.net-Core,那么您正在混合 Web API
版本。让操作返回派生的IActionResult,因为在您当前的代码中,框架将HttpResponseMessage其视为模型。

[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语句,则流将在响应发送之前被释放,并导致异常或损坏的响应。

2022-07-18