Безопасность потоков 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-запросов приходят одновременно?
- WCF выполняет AuthenticationInterceptor одновременно, что означает, что экземпляры SecurityContext и IUserFinder должны быть потокобезопасными? IUserFinder зависит от ресурсов базы данных.
- Каждый запрос выполняется один за другим, поэтому AuthenticationInterceptor не может выполняться одновременно двумя разными вызовами?
1 ответ
Я нашел это самостоятельно. Кажется, что для данного запроса все RequestInterceptors выполняются потокобезопасным способом до обработки следующего запроса. Все запросы помещаются в очередь до завершения первого запроса, чтобы пройти все перехватчики запросов.