1. ホーム
  2. asp.net

[解決済み】ASP.NET Web APIでコントローラからバイナリファイルを返す。

2022-03-25 01:54:12

質問

ASP.NET MVCの新しいWebAPIを使用して、主にバイナリファイルを提供するWebサービスに取り組んでいます。 .cab.exe ファイルを作成します。

次のコントローラメソッドは動作しているように見えます。つまり、ファイルを返しますが、コンテンツタイプに application/json :

public HttpResponseMessage<Stream> Post(string version, string environment, string filetype)
{
    var path = @"C:\Temp\test.exe";
    var stream = new FileStream(path, FileMode.Open);
    return new HttpResponseMessage<Stream>(stream, new MediaTypeHeaderValue("application/octet-stream"));
}

何か良い方法はないでしょうか?

どのように解決するのですか?

シンプルな HttpResponseMessage とその Content プロパティに設定された StreamContent :

// using System.IO;
// using System.Net.Http;
// using System.Net.Http.Headers;

public HttpResponseMessage Post(string version, string environment,
    string filetype)
{
    var path = @"C:\Temp\test.exe";
    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
    var stream = new FileStream(path, FileMode.Open, FileAccess.Read);
    result.Content = new StreamContent(stream);
    result.Content.Headers.ContentType = 
        new MediaTypeHeaderValue("application/octet-stream");
    return result;
}

について、いくつか注意すべき点があります。 stream を使用しています。

  • を呼び出してはいけません。 stream.Dispose() Web API はコントローラメソッドの result を使用して、データをクライアントに送り返します。したがって using (var stream = …) ブロックを作成します。Web APIはあなたに代わってストリームを破棄します。

  • ストリームの現在位置が0(つまりストリームのデータの先頭)に設定されていることを確認します。上の例では、ファイルを開いたばかりなので、これは当然のことです。しかし、他のシナリオでは(例えば、最初にバイナリデータを MemoryStream を使用するようにしてください。 stream.Seek(0, SeekOrigin.Begin); を設定するか stream.Position = 0;

  • ファイルストリームの場合、明示的に FileAccess.Read IIS のアプリケーションプールアカウントには、しばしば wwwroot に対する読み取り/リスト/実行アクセス権しか与えられていません。