こんにちは、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