2009-06-03 22 views
1

ASP.NET MVC ViewResultクラスにIDisposableを実装することは合法ですか?私のカスタムビューの結果には、クライアントにストリーミングされたストリームが閉じられていることを保証したいストリームメンバーがあります。 ASP.NET MVCはViewResult実装でIDiposableを受け入れますか?ASP.NET MVC ViewResult質問

ありがとうございました!

答えて

2

ViewResultはIDisposableインターフェイスを実装していません。 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); 

    } 

} 

更新日:

あなたは(するViewResultから派生)クラスでIDisposableインターフェイスを実装する場合のDispose()(IDisposable.Dispose())ASP.NET MVCフレームワークによって呼び出されることはありません。

+0

彼のカスタムViewResultがIDisposableを実装できるかどうか質問していると思います。 – DSO

+0

... MVCフレームワークがDisposeを呼び出すかどうかを調べます。 – DSO

+0

これはMVCの重大な欠陥です!彼らがそれを世話することを願っています。たとえば、FileStreamResultは渡されたストリームを破棄しません。 – erikkallen

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は、コントローラに追加されますし、その後必要がありますが、私は慣れていないよ。私はあなたのような何かを行うことができると信じて)。