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