Учебники

WCF — Управление экземплярами

Набор методов, используемых WCF для привязки набора сообщений (клиентских запросов) к экземплярам службы, известен как Управление экземплярами. WCF поддерживает три типа активации экземпляров, и они обсуждаются в этой главе.

Per-Call Service

Служба на основе вызова — это режим активации экземпляра по умолчанию для WCF. Когда служба WCF настроена для службы для каждого вызова, объект CLR создается для промежутка времени, в течение которого выполняется вызов или запрос клиента. CLR обозначает Common Language Runtime и включает экземпляры служб в WCF.

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

Свойство InstanceContextMode должно быть установлено равным InstanceContextMode.PerCall, чтобы указать, что служба WCF действует как служба для каждого вызова. Свойство InstanceContextMode принадлежит атрибуту ServiceBehavior. Следовательно, услуга для каждого вызова может быть настроена следующим образом:

[ServiceContract]
interface IMyContract
{...}
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]
class MyService : IMyContract
{...} 

Сервис здесь выражается как IMyContract. На следующем рисунке показан процесс активации экземпляра службы для каждого вызова.

Управление экземплярами Wcf за услугу вызова

Внедрение услуги по вызову

[DataContract]
class Param {....}

[ServiceContract]
interface IMyContract {
   [OperationContract]
   void MyMethod(Param objectIdentifier);
}
class MyPerCallService : IMyContract, IDisposable {
   public void MyMethod(Param objectIdentifier) {
      GetState(objectIdentifier); 
      DoWork();
      SaveState(objectIdentifier);
   }
   
   void GetState(Param objectIdentifier) {....}
   void DoWork() {....}
   void SaveState(Param objectIdentifier) {....}
   public void Dispose() {....}
}

Здесь Param — параметр псевдотипа, изобретенный для вышеприведенного примера.

Per-Session Service

В этом режиме активации WCF между двумя объектами, то есть клиентом и конкретным экземпляром службы, поддерживается конфиденциальный или, можно сказать, конфиденциальный сеанс. Также известная как служба частного сеанса, служба для каждого сеанса предлагает новый экземпляр службы, который остается выделенным для каждого запроса клиента и независимым от всех других экземпляров, относящихся к этой службе, поддерживающей сеанс.

Чтобы инициировать сеансовую службу, для свойства InstanceContextMode необходимо установить значение PerSession. Здесь экземпляр службы остается в памяти на протяжении всего сеанса.

Режим активации страдает от масштабируемости, поскольку сконфигурированная служба не может поддерживать какие-либо дополнительные выдающиеся клиенты, кроме нескольких (или, может быть, до нескольких сотен) из-за стоимости каждого отдельного экземпляра службы.

Сервис для каждой сессии может быть настроен как —

[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract
{...}

Процесс обслуживания за сеанс может быть описан, как показано на следующем рисунке —

Управление экземплярами Wcf для каждой сессии

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

Сервисный код

[ServiceContract(Session = true)]
interface IMyContract {
   [OperationContract]
   void MyMethod();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract, IDisposable {
   int m_Counter = 0; MyService() {Console.WriteLine("MyService.MyService()"); }
   
   public void MyMethod() {
      m_Counter++;
      Console.WriteLine("Counter = " + m_Counter);
   }
   public void Dispose() { 
      Console.WriteLine("MyService.Dispose()"); 
   }
}

Код клиента

MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.MyMethod(); 
proxy.Close();

Выход

MyService.MyService() Counter = 1 Counter = 2 MyService.Dispose()

Синглтон Сервис

В этом режиме активации WCF все клиентские запросы, независимые друг от друга, подключаются к одному и тому же общеизвестному отдельному экземпляру независимо от их подключения к конечным точкам службы. Синглтон-сервис удаляется только тогда, когда хост закрывается.

Этот сервис создается только один раз при создании хоста. В случае, если хосту не предоставлен какой-либо одноэлементный экземпляр, сервис возвращается как NULL. Режим активации наиболее эффективен, когда объем работы в каждом вызове метода невелик и в фоновом режиме нет ожидающих операций.

Свойство InstanceContextMode необходимо установить в InstanceContextMode.Single, чтобы инициировать эту службу Singleton.

Следовательно, услуга Singleton может быть настроена как —

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : ...
{...}

Процесс обслуживания Singleton показан на следующем рисунке —

Wcf Instance Management Singleton Service

Следующий код используется для инициализации и размещения экземпляра синглтона.