4

こんにちは、WebApi の Autofac サポートを使用して作成された Authorization フィルターがあります。概要は次のとおりです。

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で説明されていると思います。

ただし、このようにすると、リクエストごとに2回呼び出されます。

行をコメントアウトすると

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

その場合、フィルターは予想どおり 1 回だけ呼び出されます。誰でもこれに光を当てることができますか?この行は必要ですか? ドキュメントに具体的に記載されているステートメントを除外するのは嫌ですが、それが問題の原因のようです。

乾杯、

P

4

1 に答える 1

3

この線:

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

インターフェイスを実装するものはすべて登録しIAutofacAuthorizationFilterます。厳密に言えば、2行目は必要ありません。

2 行目は、Autofac が上記の行で既に自動的に行っていることを再登録するだけです。したがって、2 行目を削除します。

于 2013-07-29T13:41:08.023 に答える