1. ホーム
  2. c#

[解決済み] ASP.Net Core Web APIでファイルを返す

2022-04-20 11:21:10

質問

問題点

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 API は HttpResponseMessage をJSONとして、HTTPコンテンツヘッダーを application/json .

解決方法は?

もしこれが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 ステートメントを使用すると、レスポンスが送信される前にストリームが破棄され、例外や破損したレスポンスが発生します。