1

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

谢谢!

4

2 回答 2

2

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())。

于 2009-06-03T19:41:44.000 回答
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,您可以使用自定义控制器工厂来执行此操作(可能有更简单的方法,但我不熟悉)。

于 2009-06-04T16:29:24.700 回答