ASP.NET Web API のコントローラーからバイナリ ファイルを返す 質問する

ASP.NET Web API のコントローラーからバイナリ ファイルを返す 質問する

.cab私は、バイナリ ファイル (主にファイル) を提供する ASP.NET MVC の新しい WebAPI を使用した Web サービスに取り組んでいます.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"));
}

これを行うより良い方法はありますか?

ベストアンサー1

シンプルなHttpResponseMessageContentプロパティをaに設定すると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

  • を呼び出さないでください。Web API は、コントローラー メソッドを処理してデータをクライアントに送り返すstream.Dispose()ときに、 にアクセスできる必要があります。したがって、ブロックを使用しないでください。Web API がストリームを自動的に破棄します。resultusing (var stream = …)

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

  • ファイルストリームでは、明示的に指定するFileAccess.Read権限は、Web サーバー上のアクセス権の問題を防ぐのに役立ちます。IIS アプリケーション プール アカウントには、wwwroot への読み取り/一覧表示/実行アクセス権のみが付与されることがよくあります。

おすすめ記事