Meine zwei Cent für Verträge in WCF

WCF (Windows Communication Foundation) ist eine sichere, zuverlässige und skalierbare Messaging-Plattform für die Entwicklung von Diensten in .Net. Wenn Sie mit WCF arbeiten, müssen Sie zuerst einen Servicevertrag erstellen und dann die darin enthaltenen Servicevorgänge oder Betriebsverträge definieren. Sie haben viele verschiedene Arten von Verträgen in WCF - Serviceverträge, Datenverträge, Fehlerverträge, Nachrichtenverträge und Betriebsverträge.

WCF-Dienste legen Verträge offen, um die Kommunikation mit den Dienstkonsumenten zu erleichtern. Ein Vertrag ist ein Standard, der in WCF verwendet wird, um anzugeben, was der Dienst tun soll. Verträge in WCF können in zwei verschiedene Kategorien eingeteilt werden:

  •  Verhaltensverträge: In WCF können wir drei Verhaltensverträge haben, nämlich ServiceContract, OperationContract und FaultContract.
  • Strukturverträge: Dazu gehören DataContract und MessageContract.

Serviceverträge und Betriebsverträge

Ein Servicevertrag wird verwendet, um die Servicevorgänge zu kennzeichnen, die für den Servicekonsumenten an einem bestimmten Serviceendpunkt verfügbar sind. Im Wesentlichen wird der ServiceContract verwendet, um die Vorgänge anzugeben, die dem Service-Client zur Verfügung stehen. Ein ServiceContract wird mithilfe des ServiceContract-Attributs definiert, das normalerweise auf eine Schnittstelle angewendet wird.

Ein Servicevertrag kann das Nachrichtenaustauschmuster zwischen dem Dienstanbieter und dem Dienstkonsumenten definieren und einen oder mehrere Dienstvorgänge ausführen. Diese werden als Betriebsverträge bezeichnet. Ein Betriebsvertrag wird verwendet, um die Signatur der Servicemethode sowie den Transaktionsfluss, die Richtung des Servicevorgangs und auch die möglicherweise zugeordneten Fehlerverträge zu definieren.

Die folgende Codeliste zeigt, wie ein typischer Servicevertrag definiert wird.

[ServiceContract]

interface ITestService

{

     [OperationContract]

     string GetMessage();

}

public class TestService  :  ITestService

{

     public string GetMessage()

      {

           return "Hello World!";

      }

}

In der oben gezeigten Codeliste ist GetMessage der einzige Betriebsvertrag im Servicevertrag. Beachten Sie, wie die Attribute angegeben wurden. Wenn Sie in Ihrem Servicevertrag eine Methode haben, für die das Attribut für den Betriebsvertrag nicht festgelegt ist, kann die Methode vom Service nicht verfügbar gemacht werden, dh die Methode kann vom Servicekonsumenten nicht verwendet werden.

DataContracts, MessageContracts und FaultContracts

Ein DataContract wird verwendet, um die Daten zu beschreiben, die über das Kabel ausgetauscht werden müssen. Hiermit wird festgelegt, wie die Daten zwischen dem Dienstanbieter und dem Dienstkonsumenten ausgetauscht werden können. Sie können das Attribut [DataContract] verwenden, um Ihren Typ so zu dekorieren, dass die Daten serialisiert werden können, bevor sie über die Leitung übertragen werden. Beim Definieren von Datenverträgen müssen Sie normalerweise Datenelemente verwenden, um die Eigenschaften des Datenvertrags zu definieren.

Das folgende Codefragment zeigt, wie Sie eine Klasse mit dem Attribut [DataContract] dekorieren können.

[DataContract]

public class Employee

{

 [DataMember]

 public string ID;

 [DataMember]

 public string FirstName;

 [DataMember]

 public string LastName;

}

Ein Nachrichtenvertrag kann verwendet werden, um den Nachrichtentext in WCF zu dekorieren. In den meisten Fällen müssten Sie keine Nachrichtenverträge verwenden - die Verwendung von Datenverträgen würde ausreichen. Wenn Sie eine fein abgestimmte Steuerung Ihrer SOAP-Nachrichten benötigen, können Sie Nachrichtenverträge nutzen. Sie können Nachrichtenverträge verwenden, um auf die SOAP-Header zuzugreifen.

Mithilfe von Nachrichtenverträgen können Sie das Format der erforderlichen SOAP-Nachricht angeben. Während das MessageHeaderAttribute auf die Mitglieder angewendet werden kann, die Sie in die SOAP-Header aufnehmen möchten, können Sie mit dem MessageBodyMemberAttribute die Mitglieder definieren, die Teil des Hauptteils der SOAP-Nachricht sein sollen.

Sie können einen Nachrichtenvertrag definieren, indem Sie das MessageContractAttribute wie unten gezeigt anwenden.

[MessageContract]

public class Transaction

{

  [MessageHeader] public DateTime date;

  [MessageBodyMember] public int amount;

}

Ein Fehlervertrag in WCF wird verwendet, um die Fehler zu definieren und zu verbreiten, die auftreten können, wenn eine Serviceoperation ausgeführt wird. Im Wesentlichen können Sie Fehlerverträge nutzen, um die Fehlermeldungen an den Dienstkonsumenten weiterzuleiten, wenn in Ihrem Dienst ein Fehler auftritt. Beachten Sie, dass Sie Ihre Betriebsverträge mit einem Fehlervertrag dekorieren können - einem Servicebetriebsvertrag können ein oder mehrere Fehlerverträge zugeordnet sein. Hier ist ein Beispiel, das zeigt, wie Fehlerverträge verwendet werden können. Beachten Sie, dass im folgenden Codebeispiel zwei Fehlerverträge mit den Namen FaultContractOne und FaultContractTwo auf den Betriebsvertragsvertrag angewendet wurden.

[ServiceContract]

interface Contract

{

 [FaultContract(typeof(FaultContractOne))]

 [FaultContract(typeof(FaultContractTwo))]

 [OperationContract]

 string GetMessage();

 }