web-dev-qa-db-ja.com

ASP.NetコアWeb APIのファイルを返す

問題

私はASP.Net Web API Controllerでファイルを返したいのですが、私のすべてのアプローチは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 APIはHTTPコンテンツヘッダーがapplication/jsonに設定されたJSONとしてHttpResponseMessageを返します。

74
Jan Kruse

これが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
    }    
}
148
Nkosi