ソースコード(http://aspnetwebstack.codeplex.com/で入手可能)を見ると、これは標準のFilterクラスでは不可能であることがわかります。IAuthorizationFilter
実装は常に実装の前にIActionFilter
実行されます。これは、承認フィルターが結果を返すときにアクションフィルターが実行されないためです。
これを解決するには、独自のControllerActionInvoker
子孫クラスを作成して、InvokeAction
メソッドをオーバーライドします。
public class MyControllerActionInvoker : ControllerActionInvoker
{
public override bool InvokeAction(ControllerContext controllerContext, string actionName)
{
// Your initialization code here
try
{
return base.InvokeAction(controllerContext, actionName);
}
finally
{
// Your finalization code here
}
}
}
MyControllerActionInvoker
カスタムクラスをカスタムクラスのコントローラーに挿入する必要がありますControllerFactory
。
public class MyControllerFactory : DefaultControllerFactory
{
private readonly MyControllerActionInvoker actionInvoker = new MyControllerActionInvoker();
/// <summary>
/// Retrieves the controller instance for the specified request context and controller type.
/// </summary>
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
var controllerInstance = base.GetControllerInstance(requestContext, controllerType);
if (controllerInstance != null)
{
var typedController = controllerInstance as Controller;
if (typedController != null)
{
typedController.ActionInvoker = this.actionInvoker;
}
}
return controllerInstance;
}
}
そしてもちろんMyControllerFactory
、MVCフレームワークに自分自身を登録する必要があります。ルートも登録している場合は、次のようにする必要があります。
var controllerFactory = new MyControllerFactory();
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
この実装はここで正常に機能します。