0

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 リクエストが同時に来るとどうなりますか?

  1. WCF は AuthenticationInterceptor を同時に実行しますか? つまり、SecurityContext と IUserFinder インスタンスはスレッドセーフである必要がありますか? IUserFinder は、データベース リソースに依存します。
  2. 各リクエストは次々に実行されるため、AuthenticationInterceptor は 2 つの異なる呼び出しで同時に実行できませんか?
4

1 に答える 1

0

私は自分でそれを見つけました。特定のリクエストに対して、次のリクエストが処理される前に、すべての RequestInterceptor がスレッドセーフな方法で実行されるようです。すべてのリクエストは、最初のリクエストがすべてのリクエスト インターセプターを通過するまでキューに入れられます。

于 2011-06-07T08:49:06.390 に答える