2009-06-03 17 views
1

Ist es legitim, Ihre ASP.NET MVC ViewResult-Klasse IDisposable zu implementieren? Mein benutzerdefiniertes Suchergebnis hat ein Stream-Mitglied, das ich garantieren möchte, ist geschlossen, sobald es zurück zum Client gestreamt wurde. Berücksichtigt ASP.NET MVC IDiposable in ViewResult-Implementierungen?ASP.NET MVC ViewResult Frage

danke!

Antwort

2

ViewResult implementiert keine IDisposable-Schnittstelle. Schauen Sie sich 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); 

    } 

} 

AKTUALISIERT:

Wenn Sie IDisposable-Schnittstelle in Ihrer Klasse (abgeleitet von Viewresult) die Dispose() (IDisposable.Dispose()) implementieren wird nicht von ASP.NET MVC-Framework aufgerufen werden.

+0

Ich denke, das OP fragt, ob sein benutzerdefiniertes ViewResult IDisposable implementieren kann. – DSO

+0

... und wenn dies der Fall ist, wird das MVC-Framework Dispose aufrufen. – DSO

+0

Dies ist ein schwerwiegender Fehler in MVC! Ich hoffe, sie kümmern sich darum. Zum Beispiel wird FileStreamResult den an ihn übergebenen Stream nicht entsorgen! – erikkallen

0

Wenn Sie dieses Verhalten möchten, können Sie es erhalten, indem Sie ControllerActionInvoker erweitern. Ich glaube, man kann so etwas tun:

// 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(); 
    } 
    } 
} 

werden Sie dann erhalten müssen, um Ihre ControllerActionInvoker an den Controller hinzugefügt, die Sie tun können, eine benutzerdefinierte Controller Factory mit (es ist wahrscheinlich ein einfacher Weg, aber ich bin nicht vertraut).