.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
シンプルなHttpResponseMessage
Content
プロパティを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 がストリームを自動的に破棄します。result
using (var stream = …)
ストリームの現在の位置が 0 (つまり、ストリームのデータの先頭) に設定されていることを確認してください。上記の例では、ファイルを開いたばかりなので、これは当然のことです。ただし、他のシナリオ (バイナリデータを に初めて書き込む場合など
MemoryStream
) では、stream.Seek(0, SeekOrigin.Begin);
または を設定してください。stream.Position = 0;
ファイルストリームでは、明示的に指定する
FileAccess.Read
権限は、Web サーバー上のアクセス権の問題を防ぐのに役立ちます。IIS アプリケーション プール アカウントには、wwwroot への読み取り/一覧表示/実行アクセス権のみが付与されることがよくあります。