Ответ 1
Ответ на ваш вопрос зависит от используемой вами привязки. Существует два параметра, контролирующих это поведение: InstanceContextMode и ConcurrencyMode. Обе эти настройки установлены в ServiceBehaviorAttribute.
InstanceContextMode контролирует, как создается экземпляр службы. Он имеет следующие значения:
-
PerCall - каждый раз при вызове службы создается новый экземпляр службы. Это поведение по умолчанию для служб, подверженных привязкам, которые не используют транспортный сеанс, надежный сеанс или сеанс безопасности = > BasicHttpBinding, WebHttpBinding.
-
PerSession - каждый раз, когда вы вызываете службу из нового экземпляра прокси, создается новый экземпляр службы. Любой последующий вызов из того же прокси-сервера обрабатывается одним и тем же экземпляром службы (экземпляр живет на сервере). По умолчанию последующий вызов должен выполняться в течение 10 минут (receiveTimeout) или освобождается экземпляр службы. Это поведение по умолчанию по умолчанию для служб, которые подвергаются связыванию, которые используют транспортный сеанс, надежный сеанс или сеанс безопасности = > WSHttpBinding (по умолчанию используется сеанс безопасности), NetTcpBinding, NetNamedPipeBinding.
-
Одиночный - существует только один экземпляр службы, и он обрабатывает все вызовы. Этот экземпляр службы может быть создан при запуске хоста или при первом вызове службы.
Теперь вы знаете, как создаются экземпляры. Второй параметр ConcurrencyMode определяет, сколько одновременных потоков могут обращаться к одному экземпляру. Каждый запрос всегда обрабатывается в отдельном потоке.
-
Одиночный - только один поток может получить доступ к экземпляру службы. Это поведение по умолчанию.
-
Reentrant - один поток может получить доступ к сервису, но он может освободить блокировку и разрешить другому потоку использовать экземпляр, в то время как поток firts будет заблокирован. Это используется в сценарии обратного вызова.
-
Несколько - несколько потоков могут получить доступ к экземпляру службы.
Теперь вы знаете, как можно одновременно использовать экземпляр. Давайте посмотрим на некоторые комбинации:
-
PerCall instancing + Single concurrency - типичный сценарий без состояния. Разрешено несколько одновременных вызовов.
-
PerCall instancing + Multiple concurrency - не имеет смысла. Он по-прежнему ведет себя как Single concurrency.
-
PerSession instancing + Single concurrency - допускаются множественные одновременные вызовы, но только один вызов от каждого прокси-сервера может обрабатываться одновременно. Другие вызовы поставлены в очередь.
-
PerSession instancing + Multiple concurrency - допускается несколько одновременных вызовов. Несколько вызовов от каждого прокси-сервера могут одновременно обращаться к одному экземпляру. Вы должны выполнить ручную синхронизацию доступа к общим полям в экземпляре службы.
-
Single instancing + Single concurrency - только один запрос может быть обработан во время. Другие запросы помещаются в очередь (по умолчанию 30 секунд).
-
Single instancing + Multiple concurrency - разрешено несколько одновременных вызовов. Все вызовы получают доступ к одному экземпляру одновременно. Вы должны выполнить ручную синхронизацию доступа к общим полям в экземпляре службы.