Zugreifen auf Dienste mithilfe eines ClientsAccessing Services Using a Client

Clientanwendungen müssen erstellen, konfigurieren und Verwenden von WCF Client- oder kanalobjekt Objekte für die Kommunikation mit Diensten.Client applications must create, configure, and use WCF client or channel objects to communicate with services. Die Überblick über WCF-Client Thema bietet einen Überblick über die Objekte und die Schritte zum Erstellen von Objekten für grundlegende Client- und kanalobjekten und deren Verwendung.The WCF Client Overview topic provides an overview of the objects and steps involved in creating basic client and channel objects and using them.

Dieses Thema bietet ausführlichere Informationen zu Problemen mit Clientanwendungen sowie Client- und Kanalobjekten, die abhängig von Ihrem Szenario hilfreich sein können.This topic provides in-depth information about some of the issues with client applications and client and channel objects that may be useful depending upon your scenario.

ÜbersichtOverview

In diesem Thema werden das Verhalten und die Probleme zu Folgendem beschrieben:This topic describes behavior and issues relating to:

  • Kanal- und Sitzungslebensdauer.Channel and session lifetimes.

  • Behandeln von Ausnahmen.Handling exceptions.

  • Grundlagen von Blockierungsproblemen.Understanding blocking issues.

  • Interaktives Initialisieren von Kanälen.Initializing channels interactively.

Kanal- und SitzungslebensdauerChannel and Session Lifetimes

Anwendungen für Windows Communication Foundation (WCF) enthält zwei Kategorien von Kanälen, Datagramm und sitzungsbasiert.Windows Communication Foundation (WCF) applications includes two categories of channels, datagram and sessionful.

Ein Datagramm ist ein Kanal, in dem alle Nachrichten nicht korreliert sind.A datagram channel is a channel in which all messages are uncorrelated. Auf einem Datagrammkanal ist normalerweise beim Fehlschlagen eines Eingabe- oder Ausgabevorgangs der nächste Vorgang nicht betroffen, und der gleiche Kanal kann wiederverwendet werden.With a datagram channel, if an input or output operation fails, the next operation is typically unaffected, and the same channel can be reused. Daher schlagen Datagrammkanäle in der Regel nicht fehl.Because of this, datagram channels typically do not fault.

Sitzungsbasierte Kanäle sind hingegen Kanäle mit einer Verbindung mit den anderen Endpunkt.Sessionful channels, however, are channels with a connection to the other endpoint. Nachrichten in einer Sitzung auf einer Seite korrelieren immer mit der gleichen Sitzung auf der anderen Seite.Messages in a session on one side are always correlated with the same session on the other side. Außerdem müssen sich beide Teilnehmer einer Sitzung einigen, dass die Anforderungen ihrer Konversation erfüllt wurden, damit diese Sitzung als erfolgreich gilt.In addition, both participants in a session must agree that the requirements of their conversation were met for that session to be considered successful. Wenn sie sich nicht einigen können, kann der sitzungsbasierte Kanal fehlschlagen.If they cannot agree, the sessionful channel may fault.

Öffnen Sie Clients explizit oder implizit, indem Sie den ersten Vorgang aufrufen.Open clients explicitly or implicitly by calling the first operation.

Hinweis

Der Versuch, fehlgeschlagene sitzungsbasierte Kanäle explizit zu erkennen, ist normalerweise nicht sinnvoll, da der Zeitpunkt der Benachrichtigung von der Sitzungsimplementierung abhängt.Trying to explicitly detect faulted sessionful channels is not typically useful, because when you are notified depends upon the session implementation. Da beispielsweise die System.ServiceModel.NetTcpBinding (bei deaktivierter zuverlässiger Sitzung) die Sitzung der TCP-Verbindung anzeigt, wenn Sie das ICommunicationObject.Faulted-Ereignis auf dem Dienst oder dem Client abhören, werden Sie wahrscheinlich bei einem Netzwerkfehler schnell benachrichtigt.For example, because the System.ServiceModel.NetTcpBinding (with the reliable session disabled) surfaces the session of the TCP connection, if you listen to the ICommunicationObject.Faulted event on the service or the client you are likely to be notified quickly in the event of a network failure. Zuverlässige Sitzungen (festgelegt durch Bindungen, in denen System.ServiceModel.Channels.ReliableSessionBindingElement aktiviert ist) sind jedoch so konzipiert, dass sie Dienste von kleineren Netzwerkfehlern isolieren.But reliable sessions (established by bindings in which the System.ServiceModel.Channels.ReliableSessionBindingElement is enabled) are designed to insulate services from small network failures. Wenn die Sitzung innerhalb eines angemessenen Zeitraums wieder eingerichtet werden kann, schlägt die gleiche, für zuverlässige Sitzungen konfigurierte Bindung unter Umständen nicht fehl, bis die Unterbrechung einen längeren Zeitraum andauert.If the session can be reestablished within a reasonable period of time, the same binding—configured for reliable sessions—might not fault until the interruption continued for a longer period of time.

Die meisten der vom System bereitgestellten Bindungen (die Kanäle für die Anwendungsebene verfügbar machen) verwenden standardmäßig Sitzungen, System.ServiceModel.BasicHttpBinding jedoch nicht.Most of the system-provided bindings (which expose channels to the application layer) use sessions by default, but the System.ServiceModel.BasicHttpBinding does not. Weitere Informationen finden Sie unter mit Sitzungen.For more information, see Using Sessions.

Richtige Verwendung von SitzungenThe Proper Use of Sessions

Sitzungen bieten die Möglichkeit festzustellen, ob der gesamte Nachrichtenaustausch vollständig ist und von beiden Seiten als erfolgreich betrachtet wurde.Sessions provide a way to know if the entire message exchange is complete, and if both sides considered it successful. Es wird empfohlen, dass eine aufrufende Anwendung den Kanal innerhalb eines Try-Blocks öffnet, verwendet und schließt.It is recommended that a calling application open the channel, use it, and close the channel inside one try block. Wenn ein Sitzungskanal geöffnet ist, die ICommunicationObject.Close-Methode einmal aufgerufen wird und dieser Aufruf erfolgreich beendet wurde, war die Sitzung erfolgreich.If a session channel is open, and the ICommunicationObject.Close method is called once, and that call returns successfully, then the session was successful. Erfolgreich bedeutet in diesem Fall, dass alle von der Bindung angegebenen Zustellungsgarantien d erfüllt wurden und die andere Seite auf dem Kanal nicht ICommunicationObject.Abort vor dem Aufrufen von Close aufgerufen hat.Successful in this case means that all delivery guarantees the binding specified were met, and the other side did not call ICommunicationObject.Abort on the channel before calling Close.

Der folgende Abschnitt enthält ein Beispiel für diesen Clientansatz.The following section provides an example of this client approach.

Behandeln von AusnahmenHandling Exceptions

Das Behandeln von Ausnahmen in Clientanwendungen ist einfach.Handling exceptions in client applications is straightforward. Wird ein Kanal innerhalb eines Try-Blocks geöffnet, verwendet und geschlossen, war die Konversation erfolgreich, wenn keine Ausnahme ausgelöst wird.If a channel is opened, used, and closed inside a try block, then the conversation has succeeded, unless an exception is thrown. In der Regel wird die Konversation abgebrochen, wenn eine Ausnahme ausgelöst wird.Typically, if an exception is thrown the conversation is aborted.

Hinweis

Verwenden der using Anweisung (Using in Visual Basic) wird nicht empfohlen.Use of the using statement (Using in Visual Basic) is not recommended. Das liegt daran, dass das Ende der using-Anweisung möglicherweise Ausnahmen verursacht, die andere Ausnahmen maskieren können, von denen Sie wissen sollten.This is because the end of the using statement can cause exceptions that can mask other exceptions you may need to know about. Weitere Informationen finden Sie unter Vermeiden von Problemen mit der Using-Anweisung.For more information, see Avoiding Problems with the Using Statement.

Im folgenden Codebeispiel verwendet das empfohlene Clientmuster einen Try/Catch-Block und nicht die using-Anweisung.The following code example shows the recommended client pattern using a try/catch block and not the using statement.

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using Microsoft.WCF.Documentation;

public class Client
{
  public static void Main()
  {
    // Picks up configuration from the config file.
    SampleServiceClient wcfClient = new SampleServiceClient();
    try
    {
      // Making calls.
      Console.WriteLine("Enter the greeting to send: ");
      string greeting = Console.ReadLine();
      Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));

      Console.WriteLine("Press ENTER to exit:");
      Console.ReadLine();

      // Done with service. 
      wcfClient.Close();
      Console.WriteLine("Done!");
    }
    catch (TimeoutException timeProblem)
    {
      Console.WriteLine("The service operation timed out. " + timeProblem.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (FaultException<GreetingFault> greetingFault)
    {
      Console.WriteLine(greetingFault.Detail.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (FaultException unknownFault)
    {
      Console.WriteLine("An unknown exception was received. " + unknownFault.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (CommunicationException commProblem)
    {
      Console.WriteLine("There was a communication problem. " + commProblem.Message + commProblem.StackTrace);
      Console.ReadLine();
      wcfClient.Abort();
    }
  }
}

Imports System
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports Microsoft.WCF.Documentation

Public Class Client
  Public Shared Sub Main()
	' Picks up configuration from the config file.
	Dim wcfClient As New SampleServiceClient()
	Try
	  ' Making calls.
	  Console.WriteLine("Enter the greeting to send: ")
	  Dim greeting As String = Console.ReadLine()
	  Console.WriteLine("The service responded: " & wcfClient.SampleMethod(greeting))

	  Console.WriteLine("Press ENTER to exit:")
	  Console.ReadLine()

	  ' Done with service. 
	  wcfClient.Close()
	  Console.WriteLine("Done!")
	Catch timeProblem As TimeoutException
	  Console.WriteLine("The service operation timed out. " & timeProblem.Message)
	  Console.ReadLine()
	  wcfClient.Abort()
	Catch greetingFault As FaultException(Of GreetingFault)
	  Console.WriteLine(greetingFault.Detail.Message)
	  Console.ReadLine()
	  wcfClient.Abort()
	Catch unknownFault As FaultException
	  Console.WriteLine("An unknown exception was received. " & unknownFault.Message)
	  Console.ReadLine()
	  wcfClient.Abort()
	Catch commProblem As CommunicationException
	  Console.WriteLine("There was a communication problem. " & commProblem.Message + commProblem.StackTrace)
	  Console.ReadLine()
	  wcfClient.Abort()
	End Try
  End Sub
End Class

Hinweis

Das Überprüfen des Werts der ICommunicationObject.State-Eigenschaft ist eine Racebedingung und wird beim Feststellen, ob ein Kanal wiederverwendet oder geschlossen werden soll, nicht empfohlen.Checking the value of the ICommunicationObject.State property is a race condition and is not recommended to determine whether to reuse or close a channel.

Datagrammkanäle schlagen nie fehl, auch wenn beim Schließen Ausnahmen auftreten.Datagram channels never fault even if exceptions occur when they are closed. Außerdem lösen Nichtduplex-Clients, bei denen keine Authentifizierung über eine sichere Konversation möglich ist, in der Regel eine System.ServiceModel.Security.MessageSecurityException aus.In addition, non-duplex clients that fail to authenticate using a secure conversation typically throw a System.ServiceModel.Security.MessageSecurityException. Wenn jedoch für den Duplexclient, der eine sichere Konversation verwendet, keine Authentifizierung möglich ist, erhält der Client stattdessen eine System.TimeoutException.However if the duplex client using a secure conversation fails to authenticate, the client receives a System.TimeoutException instead.

Weitere Informationen zum Arbeiten mit Fehlerinformationen auf Anwendungsebene, finden Sie unter angeben und Behandeln von Fehlern in Verträgen und Diensten.For more complete information about working with error information at the application level, see Specifying and Handling Faults in Contracts and Services. Erwartete Ausnahmen erwartete Ausnahmen beschreibt und zeigt, wie sie behandelt.Expected Exceptions describes expected exceptions and shows how to handle them. Weitere Informationen zum Umgang mit Fehlern beim Entwickeln von Kanälen finden Sie unter Behandlung von Ausnahmen und Fehlern.For more information about how to handle errors when developing channels, see Handling Exceptions and Faults.

Clientblockierung und LeistungClient Blocking and Performance

Wenn eine Anwendung synchron einen Anforderungs-/Antwortvorgang aufruft, wird der Client blockiert, bis ein Rückgabewert empfangen oder eine Ausnahme (wie System.TimeoutException) ausgelöst wird.When an application synchronously calls a request-reply operation, the client blocks until a return value is received or an exception (such as a System.TimeoutException) is thrown. Dieses Verhalten ähnelt lokalem Verhalten.This behavior is similar to local behavior. Wenn eine Anwendung synchron einen Vorgang für eine WCF-Clientobjekt oder-Kanal aufruft, gibt der Client keinen zurück, bis die Kanalebene die Daten schreiben kann, mit dem Netzwerk oder bis eine Ausnahme ausgelöst wird.When an application synchronously invokes an operation on a WCF client object or channel, the client does not return until the channel layer can write the data to the network or until an exception is thrown. Und während das unidirektionale Nachrichtenaustauschmuster (angegeben durch die Markierung eines Vorgangs, wobei OperationContractAttribute.IsOneWay auf true festgelegt ist) die Reaktionsgeschwindigkeit einiger Clients verbessern kann, können unidirektionale Vorgänge abhängig von der Bindung und den bisher gesendeten Nachrichten auch blockiert werden.And while the one-way message exchange pattern (specified by marking an operation with OperationContractAttribute.IsOneWay set to true) can make some clients more responsive, one-way operations can also block, depending upon the binding and what messages have already been sent. Bei unidirektionalen Vorgängen geht es nur um den Nachrichtenaustausch.One-way operations are only about the message exchange, no more and no less. Weitere Informationen finden Sie unter unidirektionaler Services.For more information, see One-Way Services.

Große Datensegmente können die Clientverarbeitung verlangsamen, egal, welches Nachrichtenaustauschmuster verwendet wird.Large data chunks can slow client processing no matter what the message exchange pattern. Um zu verstehen, wie diese Probleme behandelt, finden Sie unter umfangreiche Daten und Streaming.To understand how to handle these issues, see Large Data and Streaming.

Wenn Ihre Anwendung beim Abschluss eines Vorgangs mehr arbeiten ausführen muss, sollten Sie ein asynchrones Methodenpaar auf der dienstvertragschnittstelle erstellen, die WCF-Client implementiert.If your application must do more work while an operation completes, you should create an asynchronous method pair on the service contract interface that your WCF client implements. Die einfachste Möglichkeit hierzu ist die Verwendung der /async wechseln Sie auf die ServiceModel Metadata Utility Tool (Svcutil.exe).The easiest way to do this is to use the /async switch on the ServiceModel Metadata Utility Tool (Svcutil.exe). Ein Beispiel finden Sie unter Vorgehensweise: Aufrufen Service Vorgänge asynchron.For an example, see How to: Call Service Operations Asynchronously.

Weitere Informationen zu erhöht die Leistung des Clients finden Sie unter Clientanwendungen mittlerer Ebene.For more information about increasing client performance, see Middle-Tier Client Applications.

Dynamisches Auswählen von Anmeldeinformationen durch den BenutzerEnabling the User to Select Credentials Dynamically

Über die IInteractiveChannelInitializer-Schnittstelle können Anwendungen eine Benutzeroberfläche anzeigen, auf der der Benutzer Anmeldeinformationen zum Erstellen eines Kanals auswählen kann, bevor die Timeout-Zeitgeber starten.The IInteractiveChannelInitializer interface enables applications to display a user interface that enables the user to choose credentials with which a channel is created before the timeout timers start.

Es gibt zwei Methoden, wie Anwendungsentwickler ein eingefügtes IInteractiveChannelInitializer nutzen können.Application developers can make use of an inserted IInteractiveChannelInitializer in two ways. Die Clientanwendung kann entweder Aufrufen ClientBase<TChannel>.DisplayInitializationUI oder IClientChannel.DisplayInitializationUI (oder eine asynchrone Version) vor dem Öffnen des Kanals (die explizite Ansatz) oder den ersten Vorgang aufrufen (die impliziteAnsatz).The client application can call either ClientBase<TChannel>.DisplayInitializationUI or IClientChannel.DisplayInitializationUI (or an asynchronous version) prior to opening the channel (the explicit approach) or call the first operation (the implicit approach).

Bei Verwendung des impliziten Ansatzes muss die Anwendung den ersten Vorgang für eine ClientBase<TChannel>-Erweiterung oder eine IClientChannel-Erweiterung aufrufen.If using the implicit approach, the application must call the first operation on a ClientBase<TChannel> or IClientChannel extension. Wenn ein anderes Element als der erste Vorgang aufgerufen wird, wird eine Ausnahme ausgelöst.If it calls anything other than the first operation, an exception is thrown.

Bei Verwendung des expliziten Ansatzes müssen durch die Anwendung die folgenden Schritte in dieser Reihenfolge ausgeführt werden:If using the explicit approach, the application must perform the following steps in order:

  1. Rufen Sie ClientBase<TChannel>.DisplayInitializationUI oder IClientChannel.DisplayInitializationUI (oder eine asynchrone Version) auf.Call either ClientBase<TChannel>.DisplayInitializationUI or IClientChannel.DisplayInitializationUI (or an asynchronous version).

  2. Wenn die Initialisierer zurückgegeben wurden, rufen Sie entweder die Open-Methode für das IClientChannel-Objekt oder für das IClientChannel-Objekt auf, das durch die ClientBase<TChannel>.InnerChannel-Eigenschaft zurückgegeben wird.When the initializers have returned, call either the Open method on the IClientChannel object or on the IClientChannel object returned from the ClientBase<TChannel>.InnerChannel property.

  3. Aufrufen von Vorgängen.Call operations.

Es wird empfohlen, dass Anwendungen mit Produktionsqualität den Prozess der Benutzeroberfläche mithilfe des expliziten Ansatzes steuern.It is recommended that production-quality applications control the user-interface process by adopting the explicit approach.

Anwendungen, die den impliziten Ansatz verwenden, rufen die Initialisierer der Benutzeroberfläche auf, aber wenn der Benutzer nicht innerhalb des Sendetimeouts der Bindung antwortet, wird bei Zurückgeben der Benutzeroberfläche eine Ausnahme ausgelöst.Applications that use the implicit approach invoke the user-interface initializers, but if the user of the application fails to respond within the send timeout period of the binding, an exception is thrown when the user interface returns.

Siehe auchSee Also

DuplexdiensteDuplex Services
Vorgehensweise: Zugreifen auf Dienste mit unidirektionalen und Anforderung-Antwort-VerträgenHow to: Access Services with One-Way and Request-Reply Contracts
Vorgehensweise: Zugreifen auf Dienste mit einem DuplexvertragHow to: Access Services with a Duplex Contract
Vorgehensweise: Zugriff auf einen WSE3.0-DienstHow to: Access a WSE 3.0 Service
Vorgehensweise: Verwenden von ChannelFactoryHow to: Use the ChannelFactory
Vorgehensweise: Asynchrones Aufrufen von DienstvorgängenHow to: Call Service Operations Asynchronously
Clientanwendungen der mittleren SchichtMiddle-Tier Client Applications