Понимание WCF ServiceBehaviorProperty ConcurrencyMode - PullRequest
3 голосов
/ 20 мая 2011

Я хотел бы понять свойство ServiceBehavior.ConcurrencyMode.

Рассмотрим следующий код на стороне обслуживания:

[ServiceContract]
public interface IMySercice {
   [OperationContract]
   int mycall(int a);
}
/*** HERE I WILL GENERATE Two variants of this code ***/
[ServiceBehaviour(InstanceContext = InstanceContextMode.Single)]
public class MyService : IMyService {
   // Constructors...
   // implementations of interface
   public int mycall(int a) { ... }
}
class Program {
   static void Main(string[] args) {
      MyServiceMyS = new MyService(...); /* Creating service instance */
      Uri MyUri = new Uri("http://services.mycompany.com/services/"); /* Base address for my hosted service */
      using (ServiceHost host = new ServiceHost(MyS)) { /* Defining service host, configuration file contains info regarding endpoints, not shown here for clarity */
         host.Start();
         host.Stop();
      }
   }
}

Теперь рассмотрим, что я хотел бы вызвать эту службу, пожалуйста, примите во внимание10 машин в сети, которые могут вызвать мой сервис.В определенный момент случается, что эти 10 машин ВСЕ делают 10 одновременных запросов на int mycall(int a).Я хотел бы изучить следующие сценарии:

СЦЕНАРИЙ 1

...
/*** VARIANT 1 ***/
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContext = InstanceContextMode.Single)]
public class MyService : IMyService {
   ...
}
...

СЦЕНАРИЙ 2

...
/*** VARIANT 2 ***/
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContext = InstanceContextMode.Single)]
public class MyService : IMyService {
   ...
}
...

Итак, поступает 10 одновременных вызовов ... что происходит воба случая?Пожалуйста, скажите мне, прав я или нет:

В сценарии 1, однопоточном, эти 10 вызовов ставятся в очередь и выполняются по одному за раз.Метод моей службы (ТО ЖЕ ВРЕМЯ МОЕЙ СЛУЖБЫ) будет вызываться десять раз подряд.В сценарии 2 многопоточный WCF заставит 10 потоков одновременно вызывать мой метод обслуживания.

Это правда, что я сказал?Спасибо

Ответы [ 2 ]

6 голосов
/ 20 мая 2011

В обоих сценариях все 10 клиентов будут обслуживаться параллельно 10 различными потоками.Причина в том, что настройка ConcurrencyMode зависит от настройки InstanceContextMode.InstanceContextMode определяет, как серверные механизмы WCF запрашивают клиентов - как создается новый экземпляр службы, если поступает запрос:

  • PerCall - каждый запрос обслуживается новым экземпляром службы
  • PerSession - все запросы от одного экземпляра прокси-сервера обслуживаются одним и тем же экземпляром службы
  • Single - на один узел хоста - все запросы обслуживаются одним и тем же экземпляром службы

Таким образом, ваше описание будет правильным, если вы также используете InstanceContextMode.Single, но значение по умолчанию PerCall для привязок, не поддерживающих сеансы (basicHttpBinding, webHttpBinding, wsHttpBinding без контекста безопасности или надежного сеанса) или PerSession для привязок, поддерживающих сеансы(netTcpBinding, netNamedPipeBinding, wsHttpBinding в конфигурации по умолчанию с использованием контекста безопасности).

ConcurrencyMode определяет, как можно использовать экземпляр службы, если несколько запросов хотят получить к ней доступ.Например, PerCall экземпляры с Multiple параллелизмом совпадают с Single параллелизмом, поскольку каждый экземпляр используется для обслуживания ровно одного запроса независимо от параметра параллелизма.

0 голосов
/ 21 мая 2011

Да, используя InstanceContextMode.Single, вы должны увидеть поведение, которое вы описали. Помимо 10 одновременных вызовов, вы на самом деле все равно получите то же поведение, потому что вы достигнете установленного по умолчанию ограничения регулирования в 10 для MaxConcurrentSessions на ServiceThrottlingBehavior вашего сервиса ("сессия", если рассматривать поведение регулирования, является общим количество каналов, которые могут быть открыты одновременно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...