4

您好我有一个授权过滤器,使用 Autofac 对 WebApi 的支持创建。总结如下:

public class ApplicationTokenValidatorAttribute : IAutofacAuthorizationFilter
{
    //...

    /// <summary>
    /// Default constructor for ApplicationTokenValidatorAttribute
    /// </summary>
    /// <param name="tenancyClient">Tenancy service used to resolve application key checks and populate tenancy object on valid controllers</param>
    /// <param name="commonServices">Provides access to commonly used services, including logging and performance tracing</param>
    public ApplicationTokenValidatorAttribute(ITenancyClient tenancyClient, ICommonServices commonServices)
    {
        _tenancyClient = tenancyClient;
        _commonServices = commonServices;
    }

    /// <summary>
    /// Pass/fails authentication, based on whether you provide a valid application key in the http headers of the request
    /// </summary>
    /// <param name="actionContext">Action filter context</param>
    public void OnAuthorization(HttpActionContext actionContext)
    {
        //...
    }

我不相信过滤器中的实际代码很重要,但如果有人不这么认为,那么我可以理智地检查它并粘贴更多。

我使用这个 autofac 代码注册它

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
builder.Register(c => 
    new ApplicationTokenValidatorAttribute(
            c.Resolve<ITenancyClient>(),
            c.Resolve<ICommonServices>()))
        .AsWebApiAuthorizationFilterFor<TenantAwareApiController>()
        .InstancePerApiRequest();

我认为正如https://code.google.com/p/autofac/wiki/WebApiIntegration中所述。

但是,如果我这样做,则每个请求都会调用两次。

如果我注释掉该行

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

那么过滤器只被调用一次,正如预期的那样。任何人都可以对此有所了解吗?我需要这条线吗?我不愿意排除文档中特别列出的声明,但这似乎是问题的根源。

干杯,

4

1 回答 1

3

该行:

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

将注册任何实现IAutofacAuthorizationFilter接口的东西。所以严格来说,你不应该需要第二行。

第二行只是重新注册 Autofac 已经在上面的行中自动执行的操作。因此,删除第二行。

于 2013-07-29T13:41:08.023 回答