1

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

ありがとう!

4

2 に答える 2

2

ViewResultはIDisposableインターフェースを実装していません。ASP.NETMVCソースを見てください:

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.NETMVCフレームワークによって呼び出されません。

于 2009-06-03T19:41:44.000 に答える
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 をコントローラーに追加する必要があります。これは、カスタム コントローラー ファクトリを使用して行うことができます (おそらくもっと簡単な方法がありますが、私はよく知りません)。

于 2009-06-04T16:29:24.700 に答える