引数を取るコンストラクターを使用してコントローラーからインスタンス化された場合、クラスはストリームをFileStreamResult
所有します。IDisposable
Stream
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();
}
}