[解決済み】ASP.NET Web APIでコントローラからバイナリファイルを返す。
質問
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 に対する読み取り/リスト/実行アクセス権しか与えられていません。
関連
-
[解決済み] 偽造防止用トークンは、別のクレームベースのユーザーのためのものだった
-
[解決済み] IIS 7、HttpHandlerとHTTPエラー500.21
-
[解決済み] Chromeを使用してASP.NET Web APIがXMLの代わりにJSONを返すようにするにはどうすればよいですか?
-
[解決済み] ASP.NET WebサイトとASP.NET Webアプリケーションのどちらを選ぶか?
-
[解決済み] ファイルアップロード ASP.NET MVC 3.0
-
[解決済み] ASP.NET MVCでenumからドロップダウンリストを作成するにはどうすればよいですか?
-
[解決済み] ASP.NET Web APIに整数の配列を渡しますか?
-
[解決済み] ASP.NET MVCにおけるApiControllerとControllerの相違点
-
[解決済み] 既存のASP.NET MVC 4 WebアプリケーションのプロジェクトにWeb APIを追加するにはどうすればよいですか?
-
[解決済み】ASP.NET Web APIを使用したセッションへのアクセス
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] レイアウトページ "~/Views/Shared/_Layout.cshtml" で、以下のセクションが定義されているが、レンダリングされていない。"スクリプト"
-
[解決済み] レイアウトページ"~/Views/Shared/_Layout.cshtml "では、以下のセクションは定義されていますが、レンダリングは行われていません。"スクリプト"
-
[解決済み] IIS7.0で「HTTPエラー500.19 - 内部サーバーエラー」を解決するには [終了しました]。
-
[解決済み] "この操作にはIIS統合パイプラインモードが必要です。"
-
[解決済み] IIS 7 Error "A specified logon session does not exist. それはすでに終了している可能性があります" https使用時
-
[解決済み] ASP.Net MVC - リソースが見つかりませんエラー
-
[解決済み] Microsoft Jet データベースエンジンは、オブジェクト 'Sheet1$' を見つけられませんでした。
-
[解決済み] Page_Loadの呼び出しとその方法について教えてください。
-
[解決済み】ASP.NET WebAPIでファイル(FileContentResult)を返す方法
-
[解決済み] ASP.Net Core Web APIでファイルを返す