5

如果使用带有参数的构造函数从 Controller 实例化该类,则该类FileStreamResult拥有一个流:IDisposableStream

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 块来确保IDisposableActionResult 将被释放 - 从概念上(并且可能过于简化)类似于:

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