ASP.NET MVC ViewResult问题

时间:2009-06-03 19:34:53

标签: asp.net-mvc idisposable

让您的ASP.NET MVC ViewResult类实现IDisposable是否合法?我的自定义视图结果有一个我想保证的流成员一旦流回客户端就会关闭。 ASP.NET MVC是否尊重ViewResult实现上的IDiposable?

谢谢!

2 个答案:

答案 0 :(得分:2)

ViewResult未实现IDisposable接口。看看ASP.NET MVC source

<强> ViewResult.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 {
...

<强> ActionResult.cs:

namespace System.Web.Mvc {

    public abstract class ActionResult {

        public abstract void ExecuteResult(ControllerContext context);

    }

}

<强>更新:

如果在类中实现IDisposable接口(从ViewResult派生),ASP.NET MVC框架将不会调用Dispose()(IDisposable.Dispose())。

答案 1 :(得分:0)

如果您想要这种行为,可以通过扩展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中,你可以使用自定义控制器工厂(可能是一种更简单的方法,但我不熟悉)。