2013-07-29 28 views
1

嗨我有一個授權過濾器,使用Autofac支持WebApi創建。摘要如下:Autofac註冊AuthorizationFilter調用兩次

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);

然後過濾器只調用一次,符合市場預期。任何人都可以對此有所瞭解嗎?我需要這條線嗎?我不願意排除文檔中特別列出的陳述,但似乎是問題的根源。

歡呼聲,

P

回答

1

行:

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 

將註冊任何實現的IAutofacAuthorizationFilter接口。所以嚴格來說,你不應該需要第二行。

第二行只是重新註冊Autofac已經自動在上面行中做了什麼。所以,刪除第二行。

+0

非常感謝 - 從文檔中不太清楚。雖然我只想讓它在特定的控制器類型上觸發,但也許我需要第二行,而不是第一行? –

+0

也許,第一行很可能是'全部抓住',所以你可以讓所有的屬性實現相同的接口。如果你有更多的控制權,可以使用第二行,但也可以在文檔中進一步閱讀,因爲它提供了一些有用的選擇。 – Digbyswift