Un tema que me ha parecido interesante es la posibilidad de poder secuenciar operaciones dentro de un servicio WCF. Muy sencillo y muy fácil de utilizar….eso sí, tiene la pega que es que esta funcionalidad es específica de WCF y no sigue ninguna especificación WS-* estandard. Así que cuidado si tenéis un requisito de interoperabilidad entre el servicio y posibles aplicaciones clientes hechas en otras tecnologías ya que no podéis utilizar esta funcionalidad.
En un servicio WCF, sobre todo si se está usando sesión, es habitual necesitar que ciertas operaciones se realicen en un cierto orden. Imaginaros el típico carrito de compra. No se puede comprar si no se han seleccionado los elementos a comprar.
Con WCF es muy sencillo implementar esta lógica, usando dos propiedades que se establecen en el OperationBehavior; IsInitiating y IsTerminating.
Si IsInitiating está true en una operación cuando ésta se invoca se crea una nueva instancia y una nueva sesión. Si ya existe una sesión esta operación no tiene efecto. Por defecto está es valor es true.
Si IsInitiating está a false sólo se puede invocar la operación si antes se ha llamado a otra operación que ha iniciado la sesión. Esto provoca que siempre tenga que haber una operación con IsInitiating = true.
Si IsTerminating = true significa que cuando se invoque esta operación se terminará la sesión y se liberará la instancia cuando la operación se termine. El valor por defecto es false. Antes de invocar a una operación con IsTerminating=true es necesario llamar a otra operación que tenga IsInitiating = true.
Por último, es importante tener en cuenta que estas dos propiedades están relacionadas con el atributo SessionMode de ServiceContract. Si algunas operación del servicio tiene el valor IsInitiating = false o IsTerminating = true es necesario poner SessionMode.Required si no queremos que nos salga una excepción.
[ServiceContract ( SessionMode = SessionMode.Required, Namespace = «…», Name = «…» ) ]
public interface IService
{
…………………..
}