为什么 FileStreamResult(可能还有 ActionResult)IDisposable?

Joe*_*Joe 5 asp.net-mvc-3

FileStreamResult类拥有一个IDisposable流,如果从与需要构造一个控制器实例化Stream的说法:

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

它(可能还有它的基类ActionResult)当然应该实现IDisposable

当然,如果一切顺利,FileStreamResult.WriteFile()方法将处理Stream. 并且当使用内置的 Action Invoker 时ControllerActionInvoker,在发生这种情况之前抛出异常的风险似乎不大。

但是考虑到 MVC 的可扩展架构,在我看来,Exception在使用自定义操作调用程序时,可能会阻止 Stream 被释放。

我原以为ActionResult应该实现IDisposable,并且应该要求 Action Invokers 来保证它们被处理掉。

这是设计缺陷还是有充分的理由?

更新

从亨克霍尔特曼的回答:

请注意,动作调用程序也无法关闭文件,很快就会关闭。

我不明白你在这里说什么 - 可能是因为我对处理程序框架的了解不够。据我所知,Stream 目前由内置的 Action Invoker 处理如下:

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

那么为什么 InvokeAction 不能使用 try/finally 块来确保处理IDisposableActionResult - 从概念上(并且可能过于简化)类似于:

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

    try
    {
        ...
        actionResult = ... call Action method
        ...
        actionResult.ExecuteResult(controllerContext);
    }
    finally
    {
        if (actionResult != null) actionResult.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)