5

引数を取るコンストラクターを使用してコントローラーからインスタンス化された場合、クラスはストリームをFileStreamResult所有します。IDisposableStream

public FileResult MyController()
{
    ...
    Stream stream = ...
    return File(stream, "text/plain", fileName);
}

確かにそれ(そしておそらくその基本クラスActionResult)は実装する必要がありますIDisposableか?

もちろん、すべてがうまくいけば、FileStreamResult.WriteFile()メソッドはStream. また、組み込みの Action Invoker を使用する場合、ControllerActionInvokerこれが発生する前に例外がスローされるリスクはあまりないようです。

Exceptionしかし、MVC の拡張可能なアーキテクチャを考えると、カスタム Action Invoker を使用するときにストリームが破棄されるのを妨げる状況が発生する可能性があるように思えます。

ActionResultを実装するIDisposable必要があり、Action Invoker はそれらが破棄されることを保証する必要があると考えていました。

これは設計上の欠陥ですか、それとも正当な理由がありますか?

アップデート

Henk Holterman の回答から:

Action Invoker もファイルを閉じることができなかったことに注意してください。

私はあなたがここで何を言っているのか理解できません。おそらく、ハンドラー フレームワークについて十分に知らないためです。私が見る限り、ストリームは現在、組み込みの Action Invoker によって次のように破棄されます。

InvokeAction => InvokeActionResult => ActionResult.ExecuteResult => FileStreamResult.WriteFile

IDisposableでは、InvokeAction が try/finally ブロックを使用してActionResult が破棄されることを確認できないのはなぜですか?

bool InvokeAction(ControllerContext controllerContext, string actionName)
{
    ...
    ActionResult actionResult;

    try
    {
        ...
        actionResult = ... call Action method
        ...
        actionResult.ExecuteResult(controllerContext);
    }
    finally
    {
        if (actionResult != null) actionResult.Dispose();
    }
}
4

0 に答える 0