如果从Controller中使用带有FileStreamResult
参数的构造函数实例化IDisposable
类,则Stream
类拥有public FileResult MyController()
{
...
Stream stream = ...
return File(stream, "text/plain", fileName);
}
流:
ActionResult
因此它(可能是它的基类IDisposable
)因此应该实现FileStreamResult.WriteFile()
?
当然,如果一切顺利,Stream
方法将处置ControllerActionInvoker
。当使用内置的Action Invoker Exception
时,在发生异常之前似乎没有太大的风险。
但鉴于MVC的可扩展体系结构,在我看来,在使用自定义Action Invoker时,ActionResult
可能会阻止Stream被处理。
我原本认为IDisposable
应该实施IDisposable
,并且应该要求Action Invokers保证他们被处置。
这是一个设计缺陷还是有充分的理由呢?
更新
来自Henk Holterman的回答:
请注意,Action Invoker也无法关闭文件,很快就会关闭。
我不明白你在这里说的是什么 - 可能是因为我对处理程序框架知之甚少。据我所知,Stream目前由内置的Action Invoker处理如下:
InvokeAction => InvokeActionResult => ActionResult.ExecuteResult => FileStreamResult.WriteFile
那么为什么InvokeAction不能使用try / finally块来确保处理bool InvokeAction(ControllerContext controllerContext, string actionName)
{
...
ActionResult actionResult;
try
{
...
actionResult = ... call Action method
...
actionResult.ExecuteResult(controllerContext);
}
finally
{
if (actionResult != null) actionResult.Dispose();
}
}
ActionResult - 概念上(可能过于简化)类似于:
{{1}}