WCF REST スターター キットの RequestInterceptor のしくみに関する技術情報を探していましたが、必要なものが見つかりませんでした。カスタム サービス ホスト ファクトリから取得したコード スニペットを見てみましょう。
protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
var host = (WebServiceHost2)base.CreateServiceHost(serviceType, baseAddresses);
var authenticationProvider = Container.TryGetInstance<IAuthenticationProvider>();
var authorizationRepository = Container.TryGetInstance<IUserFinder>();
if (authenticationProvider == null)
authenticationProvider = new DefaultAuthenticationProvider(authorizationRepository);
var securityContext = new SecurityContext();
host.Interceptors.Add(new AuthenticationInterceptor(authenticationProvider, securityContext));
return host;
}
そのコード inCreateServiceHost メソッドは 1 回だけ実行されます。
ただし、HTTP リクエストごとに AuthenticationInterceptor が実行されます。ご覧のとおり、AuthenticationInterceptor は SecurityContext クラスと IUserFinder リポジトリに依存しています。
複数の HTTP リクエストが同時に来るとどうなりますか?
- WCF は AuthenticationInterceptor を同時に実行しますか? つまり、SecurityContext と IUserFinder インスタンスはスレッドセーフである必要がありますか? IUserFinder は、データベース リソースに依存します。
- 各リクエストは次々に実行されるため、AuthenticationInterceptor は 2 つの異なる呼び出しで同時に実行できませんか?