Я искал техническую информацию о том, как работает 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 не может выполняться одновременно двумя разными вызовами?