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