Безопасность потоков WCF REST StarterKit и RequestInterceptor - PullRequest
0 голосов
/ 11 мая 2011

Я искал техническую информацию о том, как работает 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 Ответ

0 голосов
/ 07 июня 2011

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

...