No Silver Bullet

技術ブログを更新しているかっこいい人にあこがれて作りました。

【C#,MVC】FileStreamResultで返却すると「閉じているストリームにアクセスすることはできません。」がエラー表示される

こんにちは。底辺プログラマーです。

CSVエクスポートの機能を作成中にこんなエラーが出力しました。
f:id:sasagin:20180416212930p:plain

「閉じているストリームにアクセスすることはできません。」というエラーメッセージがでかでかと表示されています。
コードを見てみると以下のようなコードを書いていました。

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が閉じた後でもクライアント側で参照することができます。
めでたしめでたし。

【C#,MVC】作成したCSVをFileContentResultで返却すると画面にCSVの内容が出力される

どうもC# MVC初心者です。

今日は以下の目的に対して、こんな現実(問題)が発生。

目的:サーバーサイド(controller)で組み立てたCSVをクライアント側に投げて、ブラウザのダウンロードダイアログを出力したい!
現実:ブラウザのダウンロードダイアログは出力されず、ブラウザの画面にCSVの内容が出力される!

今日はそれを解決したいと思います!

続きを読む