ClientarchitekturClient Architecture

Anwendungen verwenden Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)-Clientobjekte, um Dienstvorgänge aufzurufen.Applications use Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) client objects to invoke service operations. In diesem Thema werden WCFWCF-Clientobjekte, WCFWCF-Clientkanäle und ihre Beziehungen mit der zugrunde liegenden Kanalarchitektur erläutert.This topic discusses WCFWCF client objects, WCFWCF client channels, and their relationships to the underlying channel architecture. Für eine grundlegende Übersicht über WCFWCF -Clientobjekte, finden Sie unter Überblick über WCF-Client.For a basic overview of WCFWCF client objects, see WCF Client Overview. Weitere Informationen über die Kanalschicht finden Sie unter Erweitern der Kanalschicht.For more information about the channel layer, see Extending the Channel Layer.

ÜbersichtOverview

Die Dienstmodelllaufzeit erstellt WCFWCF-Clients, die aus Folgendem zusammengesetzt sind:The service model run time creates WCFWCF clients, which are composed of the following:

  • 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.An automatically generated client implementation of a service contract, which turns calls from your application code into outgoing messages, and turns response messages into output parameters and return values that your application can retrieve.

  • 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.An implementation of a control interface (System.ServiceModel.IClientChannel) that groups together various interfaces and provides access to control functionality, most notably the ability to close the client session and dispose the channel.

  • Ein Clientkanal, der auf Grundlage der von der verwendeten Bindung angegebenen Konfigurationseinstellungen erstellt wird.A client channel that is built based on the configuration settings specified by the used binding.

Anwendungen können solche Clients nach Bedarf, entweder durch Erstellen einer System.ServiceModel.ChannelFactory oder durch Erstellen einer Instanz von einer ClientBase<TChannel> abgeleitete Klasse, wie sie von generiert die ServiceModel Metadata Utility Tool (Svcutil.exe).Applications can create such clients on demand, either through a System.ServiceModel.ChannelFactory or by creating an instance of a ClientBase<TChannel> derived class as it is generated by the ServiceModel Metadata Utility Tool (Svcutil.exe). Diese vorgefertigten Clientklassen kapseln und delegieren an eine Clientkanalimplementierung, die durch eine ChannelFactory dynamisch erstellt wird.These ready-built client classes encapsulate and delegate to a client channel implementation that is dynamically constructed by a ChannelFactory. Deshalb stehen der Clientkanal und die Kanalfactory, die diese hervorbringen, bei dieser Erläuterung im Zentrum des Interesses.Therefore, the client channel and the channel factory that produces them are the focal point of interest for this discussion.

Clientobjekte und ClientkanäleClient Objects and Client Channels

Die Basisschnittstelle von WCFWCF-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.The base interface of WCFWCF clients is the System.ServiceModel.IClientChannel interface, which exposes core client functionality as well as the basic communication object functionality of System.ServiceModel.ICommunicationObject, the context functionality of System.ServiceModel.IContextChannel, and the extensible behavior of System.ServiceModel.IExtensibleObject<T>.

Die IClientChannel-Schnittstelle definiert jedoch keinen Dienstvertrag.The IClientChannel interface, however, does not define a service contract itself. Diese werden von der dienstvertragschnittstelle deklariert (i. d. r. aus Dienstmetadaten mithilfe eines Tools wie generiert die ServiceModel Metadata Utility Tool (Svcutil.exe)).Those are declared by the service contract interface (typically generated from service metadata using a tool like the ServiceModel Metadata Utility Tool (Svcutil.exe)). WCFWCF-Clienttypen erweitern sowohl IClientChannel als auch die Zieldienstvertragsschnittstelle, damit Anwendungen Vorgänge direkt aufrufen können und Zugriff auf clientseitige Laufzeitfunktionen haben. client types extend both IClientChannel and the target service contract interface to enable applications to call operations directly and also have access to client-side run-time functionality. Aus der Erstellung eines WCFWCF-Clients resultieren WCFWCF-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.Creating an WCFWCF client provides WCFWCFSystem.ServiceModel.ChannelFactory objects with the information necessary to create a run time that can connect and interact with the configured service endpoint.

Wie bereits zuvor erwähnt, müssen die beiden WCFWCF-Clienttypen konfiguriert werden, bevor Sie sie verwenden können.As mentioned earlier, the two WCFWCF client types must be configured before you can use them. Die einfachsten WCFWCF-Clienttypen sind Objekte, die von ClientBase<TChannel> hergeleitet werden (oder DuplexClientBase<TChannel>, falls es sich bei dem Dienstvertrag um einen Duplexvertrag handelt).The simplest WCFWCF client types are objects that derive from ClientBase<TChannel> (or DuplexClientBase<TChannel> if the service contract is a duplex contract). 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.You can create these types by using a constructor, configured programmatically, or by using a configuration file, and then called directly to invoke service operations. Für eine grundlegende Übersicht über ClientBase<TChannel> anzuzeigen, Überblick über WCF-Client.For a basic overview of ClientBase<TChannel> objects, see WCF Client Overview.

Der zweite Typ wird zur Laufzeit von einem Aufruf der CreateChannel-Methode generiert.The second type is generated at run time from a call to the CreateChannel method. Anwendungen strikte Kontrolle der Kommunikationsdetails unterliegen, in der Regel verwenden diesen Clienttyp, bezeichnet einen clientkanalobjekt, weil dadurch eine direktere Interaktion möglich ist als dem zugrunde liegenden Laufzeit für Client und dem Kanal System.Applications concerned with tight control of the communication specifics typically use this client type, called a client channel object, because it enables more direct interaction than the underlying client run-time and channel system.

KanalfactorysChannel Factories

Die Klasse, die für das Erstellen der zugrunde liegenden Laufzeit verantwortlich ist, die Clientaufrufe unterstützt, ist die System.ServiceModel.ChannelFactory<TChannel>-Klasse.The class that is responsible for creating the underlying run time that supports client invocations is the System.ServiceModel.ChannelFactory<TChannel> class. Sowohl WCFWCF-Clientobjekte als auch WCFWCF-Clientkanalobjekte verwenden ein ChannelFactory<TChannel>-Objekt zum Erstellen von Instanzen. Das abgeleitete ClientBase<TChannel>-Clientobjekt kapselt die Verarbeitung der Kanalfactory. Für viele Szenarien ist es jedoch angebracht, die Kanalfactory direkt zu verwenden.Both WCFWCF client objects and WCFWCF client channel objects use a ChannelFactory<TChannel> object to create instances; the ClientBase<TChannel> derived client object encapsulates the handling of the channel factory, but for a number of scenarios it is perfectly reasonable to use the channel factory directly. Das am häufigsten vorkommende Szenario ist, wenn Sie wiederholt aus einer bereits vorhandenen Factory neue Clientkanäle erstellen möchten.The common scenario for this is if you want to repeatedly create new client channels from an existing factory. Wenn Sie ein Clientobjekt verwenden, können Sie die zugrunde liegende Kanalfactory aus einem WCFWCF-Clientobjekt erhalten, indem Sie die ClientBase<TChannel>.ChannelFactory-Eigenschaft aufrufen.If you are using a client object, you can obtain the underlying channel factory from a WCFWCF client object by calling the ClientBase<TChannel>.ChannelFactory property.

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.The important thing to remember about channel factories is that they create new instances of client channels for the configuration provided to them prior to calling ChannelFactory<TChannel>.CreateChannel. Sobald Sie CreateChannel (oder ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel oder einen anderen Vorgang eines WCFWCF-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.Once you call CreateChannel (or ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel, or any operation on a WCFWCF client object), you cannot modify the channel factory and expect to get channels to different service instances, even if you are merely changing the target endpoint address. Wenn Sie ein Clientobjekt oder einen Clientkanal mit einer anderen Konfiguration erstellen möchten, müssen Sie zunächst eine neue Kanalfactory erstellen.If you want to create a client object or client channel with a different configuration, you must create a new channel factory first.

Weitere Informationen zu verschiedenen Problemen mit WCFWCF Clientobjekten und WCFWCF Clientkanäle finden Sie unter beim Zugriff auf Dienste, die mithilfe eines WCF-Clients.For more information about various issues using WCFWCF client objects and WCFWCF client channels, see Accessing Services Using a WCF Client.

In den folgenden beiden Abschnitten werden die Erstellung und die Verwendung von WCFWCF-Clientkanalobjekten beschrieben.The following two sections describe the creation and use of WCFWCF client channel objects.

Erstellen eines neuen WCF-ClientkanalobjektsCreating a New WCF Client Channel Object

Um die Verwendung eines Clientkanals zu illustrieren, wird davon ausgegangen, dass der folgende Dienstvertrag generiert wurde.To illustrate the use of a client channel, assume the following service contract has been generated.

[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>).To connect to an ISampleService service, use the generated contract interface directly with a channel factory (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.Once you create and configure a channel factory for a particular contract, you can call the CreateChannel method to return client channel objects that you can use to communicate with an ISampleService service.

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.When using the ChannelFactory<TChannel> class with a service contract interface, you must cast to the IClientChannel interface to explicitly open, close, or abort the channel. 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.To make it easier to work with, the Svcutil.exe tool also generates a helper interface that implements both the service contract interface and IClientChannel to enable you to interact with the client channel infrastructure without having to cast. Im folgenden Code wird die Definition eines Hilfsclientkanals, der den vorangehenden Dienstvertrag implementiert, veranschaulicht.The following code shows the definition of a helper client channel that implements the preceding service contract.

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

Erstellen eines neuen WCF-ClientkanalobjektsCreating a New WCF Client Channel Object

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.To use a client channel to connect to an ISampleService service, use the generated contract interface (or the helper version) directly with a channel factory, passing the type of the contract interface as the type parameter. 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.Once a channel factory for a particular contract has been created and configured, you can call the ChannelFactory<TChannel>.CreateChannel method to return client channel objects that you can use to communicate with an ISampleService service.

Die Clientkanalobjekte implementieren bei ihrer Erstellung IClientChannel sowie die Vertragsschnittstelle.When created, the client channel objects implement IClientChannel and the contract interface. Deshalb können Sie diese direkt zum Aufrufen von Vorgängen verwenden, die mit einem Dienst interagieren, der diesen Vertrag unterstützt.Therefore, you can use them directly to call operations that interact with a service that supports that contract.

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.The difference between using client objects and client channel objects is merely one of control and ease of use for developers. Viele Entwickler, die gerne mit Klassen und Objekten arbeiten, bevorzugen wahrscheinlich die Verwendung des WCFWCF-Clientobjekts gegenüber dem WCFWCF-Clientkanal.Many developers who are comfortable working with classes and objects will prefer to use the WCFWCF client object instead of the WCFWCF client channel.

Ein Beispiel finden Sie unter Vorgehensweise: Verwenden der ChannelFactory.For an example, see How to: Use the ChannelFactory.