アクション フィルターと Autofac で問題が発生しています。依存関係を使用して、リクエストをリダイレクトする必要があるかどうかを判断するアクション フィルターがあります。このフィルターをコントローラー アクションのサブセットのみに明示的に適用しています。このフィルタが適用されていないアクションにリダイレクトされます。ただし、フィルターは引き続きトリガーされ、無限ループに陥ります。
以下のコードは、進行中のロジックの一部のスケルトンであることに注意してください。私が抱えている問題をキャプチャしたいだけです。
私の場合、この属性を持つコントローラーはビルドイン アカウント コントローラーです。つまり、ログイン アクションです。FitlerConfig.cs のすべてのアクションに適用されるように、自動化フィルターを設定しました。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AuthorizeAttribute());
filters.Add(new HandleErrorAttribute());
}
私のフィルタは次のようになります。
public class CustomFilter : ActionFilterAttribute
{
public SomeDependancy MyDependancy { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (MyDependancy.ShouldRedirect)
{
filterContext.Result = new RedirectToRouteResult("Default",
new RouteValueDictionary
{
{ "controller", "Error" }, { "action", "CustomError" }
}
);
}
base.OnActionExecuting(filterContext);
return;
}
}
私のアカウント管理者:
public class AccountController : Controller
{
[AllowAnonymous]
[CustomFilter]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
}
エラー コントローラ:
public class ErrorController : Controller
{
[AllowAnonymous]
public ActionResult CustomError()
{
return View("CustomError");
}
}
そして最後に、私の autofac 登録:
var builder = new ContainerBuilder();
builder.Register(con => new SomeDependancy()).AsSelf().InstancePerHttpRequest();
builder.RegisterType<CustomFilter>().As<IActionFilter>().PropertiesAutowired();
// property injection on filters
builder.RegisterFilterProvider();
// Needed to allow property injection in custom action filters.
builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>();
builder.RegisterControllers(typeof(MvcApplication).Assembly).InjectActionInvoker();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
CustomFilter にブレーク ポイントを設定すると、ログイン ページに移動すると、ブレークポイントにヒットしてリダイレクトが発生し、ブレーク ポイントに何度も何度もヒットします。私を困惑させているのは、このアクション フィルターがそのコントローラーまたはアクションに適用されていないという事実です。
依存関係をコメントアウトし、単にフィルターをリダイレクトしてから autofac 登録をコメントアウトすると、期待どおりに機能します。ログイン画面にヒットすると、フィルターがトリガーされ、エラー ページにリダイレクトされます。