ASP.NET MVC ViewResultクラスにIDisposableを実装することは合法ですか?私のカスタムビューの結果には、クライアントにストリーミングされたストリームが閉じられていることを保証したいストリームメンバーがあります。 ASP.NET MVCはViewResult実装でIDiposableを受け入れますか?ASP.NET MVC ViewResult質問
ありがとうございました!
ASP.NET MVC ViewResultクラスにIDisposableを実装することは合法ですか?私のカスタムビューの結果には、クライアントにストリーミングされたストリームが閉じられていることを保証したいストリームメンバーがあります。 ASP.NET MVCはViewResult実装でIDiposableを受け入れますか?ASP.NET MVC ViewResult質問
ありがとうございました!
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フレームワークによって呼び出されることはありません。
この動作を実行するには、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は、コントローラに追加されますし、その後必要がありますが、私は慣れていないよ。私はあなたのような何かを行うことができると信じて)。
彼のカスタムViewResultがIDisposableを実装できるかどうか質問していると思います。 – DSO
... MVCフレームワークがDisposeを呼び出すかどうかを調べます。 – DSO
これはMVCの重大な欠陥です!彼らがそれを世話することを願っています。たとえば、FileStreamResultは渡されたストリームを破棄しません。 – erikkallen