Return file in ASP.Net Core Web API

.net-core, asp.net-core, asp.net-core-webapi, c#

Solution

If this is ASP.net-Core then you are mixing web API versions. Have the action return a derived `IActionResult` because in your current code the framework is treating `HttpResponseMessage` as a model.

[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", "{{filename.ext}}"); // returns a FileStreamResult
    }    
}

Note:

The framework will dispose of the stream used in this case when the response is completed. If a `using` statement is used, the stream will be disposed before the response has been sent and result in an exception or corrupt response.

Problem

Problem I want to return a file in my ASP.Net Web API Controller, but all my approaches return the `HttpResponseMessage` as JSON. Code so far ``` 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; } ``` When I call this endpoint in my browser, the Web API returns the `HttpResponseMessage` as JSON with the HTTP Content Header set to `application/json`.

Original source