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