Безопасность потоков WCF REST StarterKit и RequestInterceptor

Я искал техническую информацию о том, как работает RequestInterceptor из стартового комплекта WCF REST, но я не нашел того, что хотел. Давайте посмотрим на фрагмент кода, взятый из фабрики хостов пользовательских сервисов:

    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 кода выполняется только один раз.

Однако при каждом HTTP-запросе выполняется AuthenticationInterceptor. Как вы можете видеть, AuthenticationInterceptor зависит от класса SecurityContext и хранилища IUserFinder.

Что происходит, когда несколько HTTP-запросов приходят одновременно?

  1. WCF выполняет AuthenticationInterceptor одновременно, что означает, что экземпляры SecurityContext и IUserFinder должны быть потокобезопасными? IUserFinder зависит от ресурсов базы данных.
  2. Каждый запрос выполняется один за другим, поэтому AuthenticationInterceptor не может выполняться одновременно двумя разными вызовами?

1 ответ

Решение

Я нашел это самостоятельно. Кажется, что для данного запроса все RequestInterceptors выполняются потокобезопасным способом до обработки следующего запроса. Все запросы помещаются в очередь до завершения первого запроса, чтобы пройти все перехватчики запросов.

Другие вопросы по тегам