【C#,MVC】FileStreamResultで返却すると「閉じているストリームにアクセスすることはできません。」がエラー表示される
こんにちは。底辺プログラマーです。
CSVエクスポートの機能を作成中にこんなエラーが出力しました。
「閉じているストリームにアクセスすることはできません。」というエラーメッセージがでかでかと表示されています。
コードを見てみると以下のようなコードを書いていました。
public ActionResult Export() { ActionResult result = null; string fileName = "test.csv"; using (MemoryStream ms = new MemoryStream()) using (var csvWriter = new StreamWriter(ms, Encoding.GetEncoding("shift-jis"))) { csvWriter.WriteLine("a,b,c"); csvWriter.WriteLine("d,e,f"); csvWriter.Flush(); // 閉じたストリームにはアクセスできませんと出力される result = File(ms, "text/csv", fileName); } return result; }
FIleオブジェクトの引数にMemoryStream型のmsを渡していました。
この処理記述だと、MemoryStreamをFileオブジェクトに格納してFileStreamResultを生成してクライアント側に投げているので、usingを抜けてStreamが閉じた後にクライアント側で参照しようとしてエラーがでている形ですかね。
そこでFileオブジェクトの記述は以下のように修正。
result = File(ms.ToArray(), "text/csv", fileName);
これでstreamをbyte[]型に変換してFileContentResultを生成しているので、Streamが閉じた後でもクライアント側で参照することができます。
めでたしめでたし。
技術ブログ
技術ブログというたいそうなものをつくりました。
頑張って更新するぞい!