WCF: administración de instancias

El conjunto de técnicas empleadas por WCF para vincular un conjunto de mensajes (solicitudes de cliente) a instancias de servicio se conoce como administración de instancias. WCF admite tres tipos de activación de instancias y se tratan en este capítulo.

Servicio por llamada

El servicio por llamada es el modo de activación de instancia predeterminado de WCF. Cuando se configura un servicio WCF para un servicio por llamada, se crea un objeto CLR para el período de tiempo en que una llamada o solicitud del cliente está en curso. CLR significa Common Language Runtime e incluye instancias de servicio en WCF.

En el servicio por llamada, cada solicitud de cliente logra una nueva instancia de servicio dedicado y su consumo de memoria es menor en comparación con otros tipos de activación de instancia.

Se requiere que la propiedad InstanceContextMode se establezca en InstanceContextMode.PerCall, para indicar un servicio WCF para que actúe como un servicio por llamada. La propiedad InstanceContextMode pertenece al atributo ServiceBehavior. Por lo tanto, un servicio por llamada se puede configurar de la siguiente manera:

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

Un servicio se expresa aquí como IMyContract. La siguiente figura muestra el proceso de activación de la instancia de servicio por llamada.

Implementación de un servicio por llamada

[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() {....}
}

Aquí, Param es el parámetro de pseudo tipo inventado para el ejemplo anterior.

Servicio por sesión

En este modo de activación de WCF, se mantiene una sesión privada o podemos decir confidencial entre las dos entidades, es decir, el cliente y una instancia de servicio en particular. También conocido como el servicio de sesión privada, el servicio por sesión ofrece una nueva instancia de servicio que permanece dedicada a cada solicitud del cliente y autónoma de todas las demás instancias pertenecientes a ese servicio con reconocimiento de sesión.

Para iniciar un servicio por sesión, se requiere que la propiedad InstanceContextMode se establezca en PerSession. Aquí, la instancia de servicio permanece en la memoria durante toda la sesión.

El modo de activación adolece de escalabilidad, ya que el servicio configurado no puede admitir clientes pendientes adicionales que no sean unos pocos (o quizás hasta unos cientos) debido al costo que implica cada una de estas instancias de servicio dedicado.

Un servicio por sesión se puede configurar como:

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

El proceso del servicio por sesión se puede describir como se muestra en la siguiente figura:

El siguiente código muestra un contrato y un servicio configurados para el uso de una sesión privada. El resultado indica que el cliente de hecho obtuvo una instancia de servicio dedicada.

Código de servicio

[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()"); 
   }
}

Codigo del cliente

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

Salida

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

Servicio Singleton

En este modo de activación de WCF, todas las solicitudes de clientes independientes entre sí se conectan a la misma instancia única conocida, independientemente de su conexión a los extremos del servicio. El servicio singleton se elimina solo cuando el anfitrión cierra.

Este servicio se crea solo por una vez cuando se crea el host. En caso de que el host no cuente con ninguna instancia singleton, el servicio devuelve NULL. El modo de activación está en su mejor momento cuando la cantidad de trabajo en cada llamada de método es pequeña y no hay operaciones pendientes en segundo plano.

Se requiere que la propiedad InstanceContextMode se establezca en InstanceContextMode.Single para iniciar este servicio Singleton.

Por lo tanto, un servicio Singleton se puede configurar como:

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

El proceso del servicio Singleton se muestra en la siguiente figura:

El siguiente código se utiliza para inicializar y alojar una instancia de singleton.

Código de servicio

[ServiceContract]
interface IMyContract {
   [OperationContract]
   void MyMethod( );
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : IMyContract {
   int m_Counter = 0;
   
   public int Counter {
      get {
         return m_Counter;
      }
      set {
         m_Counter = value;
      }
   }
   public void MyMethod( ) {
      m_Counter++;
      Trace.WriteLine("Counter = " + Counter);
   }
}

Código de host

MySingleton singleton = new MySingleton( );
singleton.Counter = 42;
ServiceHost host = new ServiceHost(singleton);
host.Open( );

//Do some blocking calls then
host.Close( );

Codigo del cliente

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

Salida

Counter = 43