0

アクション フィルターと 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 登録をコメントアウトすると、期待どおりに機能します。ログイン画面にヒットすると、フィルターがトリガーされ、エラー ページにリダイレクトされます。

4

1 に答える 1

2

私は自分の問題の問題を見つけました。

AutofacのExtensibleActionInvokerのソースコードを調べました。

https://code.google.com/p/autofac/source/browse/src/Source/Autofac.Integration.Web.Mvc3/ExtensibleActionInvoker.cs?spec=svn94f70ab10f4d65991c600e2e80171ce4847589e6&r=94f70ab10f4d65991c600e2e80171ce4857

コンストラクターで次のようなコメントを読みました。

/// The following types, if registered in the container, will be added to the
/// filters list:
/// <list>
/// <item><see cref="IActionFilter"/></item>
/// <item><see cref="IAuthorizationFilter"/></item>
/// <item><see cref="IExceptionFilter"/></item>
/// <item><see cref="IResultFilter"/></item>
/// </list>

私の問題を解決するために、私は結局:

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を登録する必要がないことがわかりました。そうすることで、ExtensibleActionInvokerが自動的にグローバルフィルターとして登録されたようです。

于 2012-08-06T20:50:36.670 に答える