C# Autofac注册授权筛选器调用两次

C# Autofac注册授权筛选器调用两次,c#,asp.net-web-api,autofac,C#,Asp.net Web Api,Autofac,您好,我有一个授权过滤器,使用Autofac对WebApi的支持创建。总结如下: public class ApplicationTokenValidatorAttribute : IAutofacAuthorizationFilter { //... /// <summary> /// Default constructor for ApplicationTokenValidatorAttribute /// </summary>

您好,我有一个授权过滤器,使用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)
    {
        //...
    }
public类ApplicationTokenValidatorAttribute:iautofAuthorizationFilter
{
//...
/// 
///ApplicationKenValidator属性的默认构造函数
/// 
///租赁服务用于解决应用程序密钥检查并在有效控制器上填充租赁对象
///提供对常用服务的访问,包括日志记录和性能跟踪
public ApplicationTokenValidator属性(iTenCyclient租户、ICommonServices CommonService)
{
_租户=租户;
_公共服务=公共服务;
}
/// 
///通过/失败身份验证,这取决于您是否在请求的http头中提供了有效的应用程序密钥
/// 
///操作筛选器上下文
授权时的公共无效(HttpActionContext actionContext)
{
//...
}
我不认为过滤器中的实际代码很重要,但是如果有人不这么认为,那么我可以检查它并粘贴更多

我用这个自动传真代码注册它

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
builder.Register(c => 
    new ApplicationTokenValidatorAttribute(
            c.Resolve<ITenancyClient>(),
            c.Resolve<ICommonServices>()))
        .AsWebApiAuthorizationFilterFor<TenantAwareApiController>()
        .InstancePerApiRequest();
builder.registerWebAPI过滤器提供程序(GlobalConfiguration.Configuration);
builder.Register(c=>
新的ApplicationTokenValidator属性(
c、 Resolve(),
c、 解析())
.aswebapiaAuthorizationFilterFor()
.InstancePerApiRequest();
我认为这是在

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

如果我把这行注释掉


RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

然后,正如预期的那样,只调用一次过滤器。有人能解释一下吗?我需要这一行吗?我不愿意排除文档中特别列出的语句,但它似乎是问题的根源

干杯

p行:

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
将注册实现
iautofacrizationfilter
接口的任何内容。严格来说,您不需要第二行


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

非常感谢-这在文档中不是很清楚。虽然我只想在特定的控制器类型上触发此操作,所以也许我确实想要第二行而不是第一行?也许,第一行是一个“陷阱”“全部”,因此您可以让所有属性实现相同的接口。如果您需要更多控制,请使用第二行,但也可以进一步阅读文档,因为它确实提供了一些有用的替代方法。