ASP MVC:IController Dispose()何时被调用?

我正在对我的一个较大的MVC应用程序进行大的重构/速度调整。 它已被部署到生产几个月,现在我开始在连接池中等待连接。 我已经跟踪了这个问题,直到没有妥善处理的连接问题。

鉴于此,我已经对我的基础控制器做了这个改变:

public class MyBaseController : Controller
{
    private ConfigurationManager configManager;  // Manages the data context.

    public MyBaseController()
    {
         configManager = new ConfigurationManager();
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (this.configManager != null)
            {
                this.configManager.Dispose();
                this.configManager = null;
            }
        }

        base.Dispose(disposing);
    }
}

现在,我有两个问题:

  • 我是否引入竞赛条件? 由于configManager管理将IQueryable<>参数公开给视图的DataContext ,因此我需要确保在视图完成呈现之前不会在控制器上调用Dispose()
  • 视图呈现之前或之后,MVC框架是否在Controller上调用Dispose() 或者,MVC框架是否将其留给GarbageCollector?

  • 视图呈现后始终调用Dispose。

    该视图在对ActionResult.ExecuteResult的调用中呈现。 这由ControllerActionInvoker.InvokeAction调用(间接),然后由ControllerBase.ExecuteCore调用。

    由于控制器在渲染视图时位于调用堆栈中,因此无法处理。


    只是为了扩大克雷格Stuntz的答案:

    ControllerFactory在处理Controller时处理。 在实现IControllerFactory接口时,需要实现的方法之一是ReleaseController。

    我不确定你使用的是什么ControllerFactory,不管你是自己制作的,而是在Reflector中查看DefaultControllerFactory,ReleaseController方法是这样实现的:

    public virtual void ReleaseController(IController controller)
    {
        IDisposable disposable = controller as IDisposable;
        if (disposable != null)
        {
            disposable.Dispose();
        }
    }
    

    如果该控制器实现了IDisposable,则传入一个IController引用,然后调用该控制器的Dispose方法。 因此,如果在请求完成后(即渲染视图之后)需要处理任何内容。 继承IDisposable并将您的逻辑放在Dispose方法中释放任何资源。

    ReleaseController方法由System.Web.Mvc.MvcHandler调用,它处理请求并实现IHttpHandler。 ProcessRequest使用HttpContext给它,并通过调用实现的ControllerFactory来启动寻找控制器来处理请求的过程。 如果您查看ProcessRequest方法,您将看到调用ControllerFactory的ReleaseController的finally块。 这仅在Controller返回ViewResult时调用。

    链接地址: http://www.djcxy.com/p/54031.html

    上一篇: ASP MVC: When is IController Dispose() called?

    下一篇: What's the point of overriding Dispose(bool disposing) in .NET?