Teilen über


Clientarchitektur

Anwendungen verwenden Windows Communication Foundation (WCF)-Clientobjekte, um Dienstvorgänge aufzurufen. In diesem Thema werden WCF-Clientobjekte, WCF-Clientkanäle und ihre Beziehungen zur zugrunde liegenden Kanalarchitektur erläutert. Eine grundlegende Übersicht über WCF-Clientobjekte finden Sie unter WCF-Clientübersicht. Weitere Informationen zur Kanalebene finden Sie unter Erweitern der Kanalebene.

Überblick

Die Dienstmodelllaufzeit erstellt WCF-Clients, die aus folgenden Komponenten bestehen:

  • Eine automatisch generierte Clientimplementierung eines Dienstvertrags, der Aufrufe von Ihrem Anwendungscode in ausgehende Nachrichten wandelt, und wandelt Antwortnachrichten in Ausgabeparameter und Rückgabewerte um, die Ihre Anwendung abrufen kann.

  • Eine Implementierung der Steuerungsschnittstelle (System.ServiceModel.IClientChannel), die verschiedene Schnittstellen gruppiert und Zugriff auf die Steuerungsfunktionalität bietet, vor allem die Möglichkeit, die Clientsitzung zu schließen und den Kanal zu verwerfen.

  • Ein Clientkanal, der auf den von der verwendeten Bindung angegebenen Konfigurationseinstellungen basiert.

Anwendungen können solche Clients bei Bedarf entweder über eine System.ServiceModel.ChannelFactory oder eine Instanz einer ClientBase<TChannel> abgeleiteten Klasse erstellen, da sie vom ServiceModel Metadata Utility Tool (Svcutil.exe) generiert wird. Diese vorgefertigten Clientklassen kapseln und delegieren an eine Clientkanalimplementierung, die durch eine ChannelFactory dynamisch erstellt wird. Daher sind der Clientkanal und die Kanalfabrik, die sie produziert, der Schwerpunkt für diese Diskussion.

Clientobjekte und Clientkanäle

Die Basisschnittstelle von WCF-Clients ist die System.ServiceModel.IClientChannel Schnittstelle, die grundlegende Clientfunktionalität sowie die grundlegende Kommunikationsobjektfunktionalität von System.ServiceModel.ICommunicationObject, die Kontextfunktionalität von System.ServiceModel.IContextChannel und das erweiterbare Verhalten von System.ServiceModel.IExtensibleObject<T> bereitstellt.

Die IClientChannel Schnittstelle definiert jedoch keinen Dienstvertrag selbst. Diese werden über die Dienstvertragsschnittstelle deklariert (in der Regel aus Dienstmetadaten mithilfe eines Tools wie dem ServiceModel Metadata Utility Tool (Svcutil.exe)). WCF-Clienttypen erweitern sowohl IClientChannel als auch die Zieldienstvertragsschnittstelle, um Anwendungen das direkte Aufrufen von Vorgängen zu ermöglichen und Zugriff auf clientseitige Laufzeitfunktionen zu haben. Das Erstellen eines WCF-Clients stellt WCF-ObjekteSystem.ServiceModel.ChannelFactory mit den erforderlichen Informationen bereit, um eine Laufzeit zu erstellen, die eine Verbindung herstellen und mit dem konfigurierten Dienstendpunkt interagieren kann.

Wie bereits erwähnt, müssen die beiden WCF-Clienttypen konfiguriert werden, bevor Sie sie verwenden können. Die einfachsten WCF-Clienttypen sind Objekte, die von ClientBase<TChannel> abgeleitet werden (oder von DuplexClientBase<TChannel>, wenn der Dienstvertrag ein Duplexvertrag ist). Sie können diese Typen mithilfe eines Konstruktors erstellen, sie programmgesteuert konfigurieren oder eine Konfigurationsdatei verwenden und dann direkt aufrufen, um Dienstvorgänge auszuführen. Eine grundlegende Übersicht über ClientBase<TChannel> Objekte finden Sie unter WCF Client Overview.

Der zweite Typ wird zur Laufzeit aus einem Aufruf der CreateChannel Methode generiert. Anwendungen, die sich mit einer engen Kontrolle der Kommunikationsspezifischen befassen, verwenden in der Regel diesen Clienttyp, der als Clientkanalobjekt bezeichnet wird, da sie eine direktere Interaktion als das zugrunde liegende Clientlaufzeit- und Kanalsystem ermöglicht.

Kanalfabriken

Die Klasse, die für das Erstellen der zugrunde liegenden Laufzeit verantwortlich ist, die Clientaufrufe unterstützt, ist die System.ServiceModel.ChannelFactory<TChannel> Klasse. Sowohl WCF-Clientobjekte als auch WCF-Clientkanalobjekte verwenden ein ChannelFactory<TChannel> Objekt zum Erstellen von Instanzen. Das ClientBase<TChannel> abgeleitete Clientobjekt kapselt die Behandlung der Kanalfactory, aber für eine Reihe von Szenarien ist es absolut sinnvoll, die Kanalfactory direkt zu verwenden. Das häufige Szenario hierfür ist, wenn Sie wiederholt neue Clientkanäle aus einer vorhandenen Factory erstellen möchten. Wenn Sie ein Clientobjekt verwenden, können Sie die zugrunde liegende Kanal-Fabrik abrufen, indem Sie die ClientBase<TChannel>.ChannelFactory Eigenschaft eines WCF-Clientobjekts aufrufen.

Bei Kanalfactorys muss beachtet werden, dass sie neue Instanzen von Clientkanälen für die ihnen zur Verfügung stehende Konfiguration erstellen, bevor sie ChannelFactory<TChannel>.CreateChannel aufrufen. Nachdem Sie CreateChannel (oder ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel oder einen Vorgang für ein WCF-Clientobjekt) aufgerufen haben, können Sie die Kanalfactory nicht mehr ändern und erwarten, dass Sie Kanäle zu verschiedenen Dienstinstanzen erhalten, selbst wenn Sie lediglich die Zielendpunktadresse ändern. Wenn Sie ein Clientobjekt oder einen Clientkanal mit einer anderen Konfiguration erstellen möchten, müssen Sie zuerst eine neue Kanalfactory erstellen.

Weitere Informationen zu verschiedenen Problemen mit WCF-Clientobjekten und WCF-Clientkanälen finden Sie unter "Zugreifen auf Dienste mithilfe eines WCF-Clients".

In den folgenden beiden Abschnitten wird die Erstellung und Verwendung von WCF-Clientkanalobjekten beschrieben.

Erstellen eines neuen WCF-Clientkanalobjekts

Um die Verwendung eines Clientkanals zu veranschaulichen, gehen Sie davon aus, dass der folgende Dienstvertrag generiert wurde.

[System.ServiceModel.ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
    [System.ServiceModel.OperationContractAttribute(
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
      ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
    )]
    [System.ServiceModel.FaultContractAttribute(
      typeof(microsoft.wcf.documentation.SampleFault),
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
    )]
    string SampleMethod(string msg);
}

Um eine Verbindung mit einem ISampleService Dienst herzustellen, verwenden Sie die generierte Vertragsschnittstelle direkt mit einer Channel-Factory (ChannelFactory<TChannel>). Nachdem Sie eine Kanalfactory für einen bestimmten Vertrag erstellt und konfiguriert haben, können Sie die CreateChannel-Methode aufrufen, um Clientkanalobjekte abzurufen, die Sie für die Kommunikation mit einem ISampleService-Dienst verwenden können.

Wenn Sie die ChannelFactory<TChannel> Klasse mit einer Dienstvertragsschnittstelle verwenden, müssen Sie zur IClientChannel Schnittstelle umwandeln, um den Kanal explizit zu öffnen, zu schließen oder abzubrechen. Zum Erleichtern der Arbeit generiert das Tool Svcutil.exe auch eine Hilfsschnittstelle, die die Dienstvertragschnittstelle und IClientChannel implementiert, wodurch die Interaktion mit der Clientkanalinfrastruktur ohne Umwandlung ermöglicht wird. Der folgende Code zeigt die Definition eines Hilfsclientkanals, der den vorherigen Dienstvertrag implementiert.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

Erstellen eines neuen WCF-Clientkanalobjekts

Um einen Clientkanal zur Verbindung mit einem ISampleService Dienst zu nutzen, greifen Sie direkt mit einer Kanalfactory auf die generierte Vertragsschnittstelle (oder die Hilfsversion) zu; übergeben Sie dabei den Typ der Vertragsschnittstelle als Typparameter. Sobald Sie eine Kanalfactory für einen bestimmten Vertrag erstellt und konfiguriert haben, können Sie die ChannelFactory<TChannel>.CreateChannel-Methode aufrufen, um die Clientkanalobjekte zurückzugeben, die Sie für die Kommunikation mit einem ISampleService-Dienst verwenden können.

Bei der Erstellung implementieren die Clientkanalobjekte sowohl IClientChannel als auch die Vertragsschnittstelle. Daher können Sie sie direkt verwenden, um Vorgänge aufzurufen, die mit einem Dienst interagieren, der diesen Vertrag unterstützt.

Der Unterschied zwischen der Verwendung von Clientobjekten und Clientkanalobjekten ist lediglich eine Frage von Kontrolle und Benutzerfreundlichkeit für Entwickler. Viele Entwickler, die mit Klassen und Objekten arbeiten, bevorzugen die Verwendung des WCF-Clientobjekts anstelle des WCF-Clientkanals.

Ein Beispiel finden Sie unter How to: Use the ChannelFactory.