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

时间:2012-10-20 13:00:24

标签: asp.net-mvc-3

如果从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}}

0 个答案:

没有答案