Mis dos centavos en contratos en WCF

WCF (Windows Communication Foundation) es una plataforma de mensajería segura, confiable y escalable para desarrollar servicios en .Net. Al trabajar con WCF, primero debe crear un contrato de servicio y luego definir las operaciones de servicio o los contratos de operación en él. Tiene muchos tipos diferentes de contratos en WCF: contratos de servicio, contratos de datos, contratos de fallas, contratos de mensajes y contratos de operación.

Los servicios WCF exponen contratos para facilitar la comunicación con los consumidores del servicio. Un contrato es un estándar que se usa en WCF para especificar lo que se supone que debe hacer el servicio. Los contratos en WCF se pueden clasificar en dos categorías distintas:

  •  Contratos de comportamiento: En WCF podemos tener tres contratos de comportamiento, a saber, ServiceContract, OperationContract y FaultContract.
  • Contratos estructurales: estos incluyen DataContract y MessageContract.

Contratos de servicio y contratos de operación

Un ServiceContract se utiliza para indicar las operaciones de servicio que están disponibles para el consumidor de servicios en un punto final de servicio en particular. En esencia, ServiceContract se utiliza para especificar las operaciones que están disponibles para que las consuma el cliente del servicio. Un ServiceContract se define mediante el atributo ServiceContract, que generalmente se aplica a una interfaz.

Un contrato de servicio puede definir el patrón de intercambio de mensajes entre el proveedor de servicios y el consumidor de servicios y puede tener una o más operaciones de servicio; estos se conocen como contratos de operación. Un contrato de operación se utiliza para definir la firma del método de servicio y también el flujo de la transacción, la dirección de la operación del servicio y también el contrato o contratos de falla que pueden estar asociados.

La lista de códigos que se proporciona a continuación ilustra cómo se define un contrato de servicio típico.

[ServiceContract]

interface ITestService

{

     [OperationContract]

     string GetMessage();

}

public class TestService  :  ITestService

{

     public string GetMessage()

      {

           return "Hello World!";

      }

}

En la lista de códigos que se muestra arriba, el único contrato de operación en el contrato de servicio es GetMessage. Observe cómo se han especificado los atributos. Además, si tiene un método en su contrato de servicio que no tiene el atributo del contrato de operación establecido, el método no puede ser expuesto por el servicio, es decir, el método no puede ser consumido por el consumidor del servicio.

DataContracts, MessageContracts y FaultContracts

Un DataContract se utiliza para describir los datos que se deben intercambiar por cable. Se utiliza para especificar cómo se pueden intercambiar los datos entre el proveedor de servicios y el consumidor de servicios. Puede usar el atributo [DataContract] para decorar su tipo de modo que los datos se puedan serializar antes de pasarlos por el cable. Al definir contratos de datos, normalmente necesitaría utilizar miembros de datos para definir las propiedades del contrato de datos.

El siguiente fragmento de código muestra cómo puede decorar una clase con el atributo [DataContract].

[DataContract]

public class Employee

{

 [DataMember]

 public string ID;

 [DataMember]

 public string FirstName;

 [DataMember]

 public string LastName;

}

Un contrato de mensaje es uno que se puede usar para decorar el cuerpo de un mensaje en WCF. En la mayoría de los casos, no necesitaría usar contratos de mensajes; el uso de contratos de datos sería suficiente. Si necesita un control detallado de sus mensajes SOAP, puede aprovechar los contratos de mensajes. Puede utilizar contratos de mensajes para acceder a los encabezados SOAP.

Puede utilizar contratos de mensajes para especificar el formato del mensaje SOAP que debe ser requerido. Si bien MessageHeaderAttribute se puede aplicar a los miembros que le gustaría incluir en los encabezados SOAP, MessageBodyMemberAttribute se puede usar para definir los miembros que deben ser parte del cuerpo del mensaje SOAP.

Puede definir un contrato de mensaje aplicando MessageContractAttribute como se muestra a continuación.

[MessageContract]

public class Transaction

{

  [MessageHeader] public DateTime date;

  [MessageBodyMember] public int amount;

}

Un contrato de falla en WCF se usa para definir y propagar los errores que pueden ocurrir cuando se ejecuta una operación de servicio. En esencia, puede aprovechar los contratos de fallas para pasar los mensajes de error al consumidor del servicio cuando ocurre un error en su servicio. Tenga en cuenta que puede decorar sus contratos de operación utilizando un contrato de falla; un contrato de operación de servicio puede tener uno o más contratos de falla asociados. A continuación, se muestra un ejemplo que muestra cómo se pueden usar los contratos de fallas. Tenga en cuenta que se han aplicado dos contratos de error denominados FaultContractOne y FaultContractTwo al contrato de operación Contract en el ejemplo de código que se muestra a continuación.

[ServiceContract]

interface Contract

{

 [FaultContract(typeof(FaultContractOne))]

 [FaultContract(typeof(FaultContractTwo))]

 [OperationContract]

 string GetMessage();

 }