Clientarchitektur

Anwendungen verwenden Windows Communication Foundation-Clientobjekte (WCF), um Dienstvorgänge aufzurufen. In diesem Artikel werden WCF-Clientobjekte, WCF-Clientkanäle und ihre Beziehungen mit der 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 Kanalschicht.

Übersicht

Die Dienstmodelllaufzeit erstellt WCF-Clients, die aus Folgendem zusammengesetzt sind:

  • Eine automatisch generierte Clientimplementierung eines Dienstvertrags, der Aufrufe Ihres Anwendungscodes in ausgehende Nachrichten umwandelt und Antwortnachrichten in Ausgabeparameter und Rückgabewerte, die von Ihrer Anwendung abgerufen werden können.

  • 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 Grundlage der von der verwendeten Bindung angegebenen Konfigurationseinstellungen erstellt wird.

Anwendungen können solche Clients bei Bedarf erstellen oder über eine System.ServiceModel.ChannelFactory oder durch Erstellen einer Instanz einer abgeleiteten ClientBase<TChannel>-Klasse, die 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. Deshalb stehen der Clientkanal und die Kanalfactory, die diese hervorbringen, bei dieser Erläuterung im Zentrum des Interesses.

Clientobjekte und Clientkanäle

Die Basisschnittstelle von WCF-Clients ist die System.ServiceModel.IClientChannel-Schnittstelle, die sowohl die Clientkernfunktionen als auch die grundlegenden Kommunikationsobjektfunktionen von System.ServiceModel.ICommunicationObject, die Kontextfunktionen von System.ServiceModel.IContextChannel sowie das erweiterbare Verhalten von System.ServiceModel.IExtensibleObject<T> verfügbar macht.

Die IClientChannel-Schnittstelle definiert jedoch keinen Dienstvertrag. Dienstverträge werden von der Dienstvertragschnittstelle (üblicherweise mit einem Tool wie dem ServiceModel Metadata Utility-Tool (Svcutil.exe) aus Dienstmetadaten generiert) deklariert. WCF-Clienttypen erweitern sowohl IClientChannel als auch die Zieldienstvertragsschnittstelle, damit Anwendungen Vorgänge direkt aufrufen können und Zugriff auf clientseitige Laufzeitfunktionen haben. Aus der Erstellung eines WCF-Clients resultieren WCF-System.ServiceModel.ChannelFactory-Objekte, die die Informationen enthalten, die zum Erstellen einer Laufzeit erforderlich sind, die mit dem konfigurierten Dienstendpunkt verbunden werden und mit ihm interagieren kann.

Wie bereits zuvor 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> hergeleitet werden (oder DuplexClientBase<TChannel>, falls es sich bei dem Dienstvertrag um einen Duplexvertrag handelt). Sie können diese Typen mithilfe eines Konstruktors erstellen, der programmgesteuert konfiguriert wird, oder durch Verwenden einer Konfigurationsdatei, die direkt aufgerufen wird, um Dienstvorgänge aufzurufen. Eine grundlegende Übersicht über ClientBase<TChannel>-Objekte finden Sie unter WCF-Clientübersicht.

Der zweite Typ wird zur Laufzeit von einem Aufruf der CreateChannel-Methode generiert. Anwendungen, die einer strengen Kontrolle der Kommunikationsdetails unterliegen, verwenden diesen Clienttyp, der als Clientkanalobjekt bezeichnet wird, da damit eine direktere Interaktion möglich ist als mit dem zugrunde liegenden Clientlaufzeit- und Kanalsystem.

Kanalfactorys

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 abgeleitete ClientBase<TChannel>-Clientobjekt kapselt die Verarbeitung der Kanalfactory. Für viele Szenarios ist es jedoch angebracht, die Kanalfactory direkt zu verwenden. Das am häufigsten vorkommende Szenario ist, wenn Sie wiederholt aus einer bereits vorhandenen Factory neue Clientkanäle erstellen möchten. Wenn Sie ein Clientobjekt verwenden, können Sie die zugrunde liegende Kanalfactory aus einem WCF-Clientobjekt erhalten, indem Sie die ClientBase<TChannel>.ChannelFactory-Eigenschaft 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. Sobald Sie CreateChannel (oder ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel oder einen anderen Vorgang eines WCF-Clientobjekts) aufrufen, können Sie die Kanalfactory nicht ändern oder erwarten, Kanäle für verschiedene Dienstinstanzen zu erhalten, auch dann nicht, wenn Sie lediglich die Zielendpunktadresse ändern. Wenn Sie ein Clientobjekt oder einen Clientkanal mit einer anderen Konfiguration erstellen möchten, müssen Sie zunächst 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 werden die Erstellung und die Verwendung von WCF-Clientkanalobjekten beschrieben.

Erstellen eines neuen WCF-Clientkanalobjekts

Um die Verwendung eines Clientkanals zu illustrieren, wird davon ausgegangen, 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 Kanalfactory (ChannelFactory<TChannel>). Sobald Sie eine Kanalfactory für einen bestimmten Vertrag erstellt und konfiguriert haben, können Sie die CreateChannel-Methode aufrufen, um die Clientkanalobjekte zurückzugeben, die Sie für die Kommunikation mit einem ISampleService-Dienst verwenden können.

Beim Verwenden der ChannelFactory<TChannel> -Klasse mit einer Dienstvertragschnittstelle muss diese in eine IClientChannel -Schnittstelle umgewandelt werden, 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. Im folgenden Code wird die Definition eines Hilfsclientkanals, der den vorangehenden Dienstvertrag implementiert, veranschaulicht.

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

Erstellen eines neuen WCF-Clientkanalobjekts

Wenn Sie einen Clientkanal zum Verbinden mit einem ISampleService-Dienst verwenden möchten, verwenden Sie die generierte Vertragsschnittstelle (oder die Hilfsversion) direkt mit einer Kanalfactory, wobei Sie den Typ der Vertragsschnittstelle als Typparameter übergeben. 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.

Die Clientkanalobjekte implementieren bei ihrer Erstellung IClientChannel sowie die Vertragsschnittstelle. Deshalb können Sie diese direkt zum Aufrufen von Vorgängen verwenden, die mit einem Dienst interagieren, der diesen Vertrag unterstützt.

Der Unterschied zwischen der Verwendung von Clientobjekten und Clientkanalobjekten liegt einfach in der Form der Steuerung und der Einfachheit der Verwendung für die Entwickler. Viele Entwickler*innen, die gerne mit Klassen und Objekten arbeiten, bevorzugen wahrscheinlich die Verwendung des WCF-Clientobjekts gegenüber dem WCF-Clientkanal.

Ein Beispiel finden Sie unter Verwenden von ChannelFactory.