让您的 ASP.NET MVC ViewResult 类实现 IDisposable 是否合法?我的自定义视图结果有一个流成员,我想保证它在流回客户端后关闭。ASP.NET MVC 在 ViewResult 实现上是否尊重 IDiposable?
谢谢!
让您的 ASP.NET MVC ViewResult 类实现 IDisposable 是否合法?我的自定义视图结果有一个流成员,我想保证它在流回客户端后关闭。ASP.NET MVC 在 ViewResult 实现上是否尊重 IDiposable?
谢谢!
ViewResult 没有实现 IDisposable 接口。查看ASP.NET MVC 源代码:
查看结果.cs:
namespace System.Web.Mvc {
using System;
using System.Globalization;
using System.Text;
using System.Web.Mvc.Resources;
public class ViewResult : ViewResultBase {
...
ViewResultBase.cs:
namespace System.Web.Mvc {
using System;
using System.Diagnostics.CodeAnalysis;
public abstract class ViewResultBase : ActionResult {
...
动作结果.cs:
namespace System.Web.Mvc {
public abstract class ActionResult {
public abstract void ExecuteResult(ControllerContext context);
}
}
更新:
如果您在您的类(派生自 ViewResult)中实现 IDisposable 接口,则 ASP.NET MVC 框架不会调用 Dispose() (IDisposable.Dispose())。
如果你想要这种行为,你可以通过扩展 ControllerActionInvoker 来获得它。我相信您可以执行以下操作:
// warning: untested
public class DisposableControllerActionInvoker : ContollerActionInvoker
{
public override void InvokeActionResult(
ControllerContext controllerContext, ActionResult actionResult)
{
base.InvokeActionResult(controllerContext, actionResult);
var disposable = actionResult as IDisposable;
if(disposable != null)
{
disposable.Dispose();
}
}
}
然后,您需要将 ControllerActionInvoker 添加到 Controller,您可以使用自定义控制器工厂来执行此操作(可能有更简单的方法,但我不熟悉)。