本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)
| 归档时间: |
|
| 查看次数: |
505 次 |
| 最近记录: |