ASP MVC: Wann ist IController Dispose() aufgerufen?
Werde ich durch ein großes refactoring /speed tweaking von einer meiner größeren MVC apps. Es wurde eingesetzt, um die Produktion für ein paar Monate jetzt, und ich begann zu bekommen timeouts warten auf verbindungen im connection pool. Ich habe verfolgt das Thema nach unten, um die Anschlüsse nicht immer entsorgt.
Im Licht, dass, seitdem habe ich diese änderung vorgenommen, um meine Basis-controller:
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);
}
}
Nun habe ich zwei Fragen:
- Bin ich der Einführung einer race-condition? Da die
configManager
verwaltet dieDataContext
entlarvtIQueryable<>
Parameter
die Ansichten, die ich brauche, um sicherzustellen, dassDispose()
werden nicht genannt
auf dem controller wird, bevor das Oberflächen-rendering. - Hat das MVC-framework nennen
Dispose()
auf den Controller an, bevor oder nachdem die view gerendert wird? Oder, hat das MVC-framework verlassen, dass
bis der GarbageCollector?
InformationsquelleAutor der Frage John Gietzen | 2009-09-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dispose aufgerufen wird, nachdem die view gerendert wird, immer.
Die view gerendert wird, die im Aufruf
ActionResult.ExecuteResult
. Das nennt man (indirekt) durchControllerActionInvoker.InvokeAction
), was wiederum heißt, indemControllerBase.ExecuteCore
.Da der controller in der call-stack, wenn der view gerendert wird, wird es nicht entsorgt werden können, dann.
InformationsquelleAutor der Antwort Craig Stuntz
Einfach zu erweitern Craig Stuntz Antwort:
Die ControllerFactory behandelt, wenn ein Controller angeordnet ist. Bei der Umsetzung der IControllerFactory-Schnittstelle, eine der Methoden, die implementiert werden müssen, ist ReleaseController.
Ich bin nicht sicher, was ControllerFactory die Sie verwenden, ob Sie rollte Ihre eigene, aber im Reflektor Blick auf die DefaultControllerFactory, die ReleaseController-Methode implementiert, etwa so:
Einer IController Referenz übergeben wird, wenn dieser controller implementiert IDisposable, dann Controller Dispose-Methode aufgerufen wird. Also, wenn Sie haben, was Sie brauchen, zu entsorgen, nachdem die Anfrage beendet ist, was nach der Ansicht gerendert wird. Erben aus der IDisposable und Ihre Logik in der Dispose-Methode freigeben von Ressourcen.
Den ReleaseController Methode wird vom System aufgerufen.Web.Mvc.MvcHandler, die die Anforderung verarbeitet und es implements IHttpHandler. Die ProcessRequest-nimmt die HttpContext gegeben und es beginnt der Prozess der Suche nach den controller, die Anforderung zu verarbeiten, durch die Berufung auf die implementierten ControllerFactory. Wenn man sich in der ProcessRequest-Methode sehen Sie den finally-block aus, welche Anrufe der ControllerFactory ist ReleaseController. Dieser wird nur aufgerufen, wenn die Steuerung zurückgegeben hat, ein ViewResult.
InformationsquelleAutor der Antwort Dale Ragan