ASP.NET MVC ViewResult クラスに IDisposable を実装させることは合法ですか? 私のカスタム ビューの結果には、ストリーム メンバーがあり、クライアントにストリーミングされた後に閉じられることを保証したいと考えています。ASP.NET MVC は ViewResult 実装で IDiposable を尊重しますか?
ありがとう!
ASP.NET MVC ViewResult クラスに IDisposable を実装させることは合法ですか? 私のカスタム ビューの結果には、ストリーム メンバーがあり、クライアントにストリーミングされた後に閉じられることを保証したいと考えています。ASP.NET MVC は ViewResult 実装で IDiposable を尊重しますか?
ありがとう!
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フレームワークによって呼び出されません。
この動作が必要な場合は、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 をコントローラーに追加する必要があります。これは、カスタム コントローラー ファクトリを使用して行うことができます (おそらくもっと簡単な方法がありますが、私はよく知りません)。