Zugreifen auf Dienste mithilfe eines WCF-Clients

Nach dem Erstellen eines Diensts ist der nächste Schritt das Erstellen eines WCF-Clientproxys. Eine Clientanwendung verwendet den WCF-Clientproxy, um mit dem Dienst zu kommunizieren. Clientanwendungen importieren normalerweise Metadaten eines Dienstes zum Generieren von WCF-Clientcode, mit dem der Dienst aufgerufen werden kann.

Nachfolgend werden die grundlegenden Schritte zum Erstellen eines WCF-Clients aufgeführt:

  1. Kompilieren Sie den Dienstcode.

  2. Generieren Sie den WCF-Clientproxy.

  3. Instanziieren Sie den WCF-Clientproxy.

Der WCF-Clientproxy kann manuell mithilfe des Dienstmodellmetadaten-Hilfsprogramms (SvcUtil.exe) generiert werden, um weitere Informationen zu erhalten, siehe ServiceModel Metadata Utility Tool (Svcutil.exe). Der WCF-Clientproxy kann auch mithilfe der Funktion Dienstverweis hinzufügen in Visual Studio generiert werden. Um den WCF-Clientproxy mithilfe einer dieser Methoden zu generieren, muss der Dienst ausgeführt werden. Wenn es sich um einen selbst gehosteten Dienst handelt, müssen Sie den Host ausführen. Wenn der Dienst in IIS/WAS gehostet wird, ist kein weiterer Schritt erforderlich.

ServiceModel Metadata Utility Tool

Das ServiceModel Metadata Utility Tool (Svcutil.exe) ist ein Befehlszeilentool zum Generieren von Code aus Metadaten. Die folgende Verwendung ist ein Beispiel für einen grundlegenden Svcutil.exe-Befehl.

Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>

Alternativ können Sie Svcutil.exe mit WSDL (Web Services Description Language) und XSD (XML Schema Definition Language)-Dateien im Dateisystem verwenden.

Svcutil.exe <list of WSDL and XSD files on file system>

Das Ergebnis ist ein Code, der WCF-Clientcode enthält, mit dem die Clientanwendung den Dienst aufrufen kann.

Sie können das Tool auch zum Generieren von Konfigurationsdateien verwenden.

Svcutil.exe <file1 [,file2]>

Wenn nur ein Dateiname angegeben wird, ist das der Name der Ausgabedatei. Wenn zwei Dateinamen angegeben werden, ist die erste Datei eine Eingabekonfigurationsdatei, deren Inhalt mit der generierten Konfiguration zusammengeführt und in die zweite Datei geschrieben wird. Weitere Informationen zur Konfiguration finden Sie unter Konfigurieren von Bindungen für Dienste.

Wichtig

Nicht gesicherte Metadatenanforderungen stellen genau wie nicht gesicherte Netzwerkanforderungen ein gewisses Risiko dar: Wenn Sie sich nicht sicher sind, ob der Endpunkt, mit dem Sie kommunizieren, der vorgegebenen Identität entspricht, stammen die abgerufenen Informationen unter Umständen von einem bösartigen Dienst.

"Dienstverweis hinzufügen" in Visual Studio

Klicken Sie, während der Dienst ausgeführt wird, mit der rechten Maustaste auf das Projekt, in dem der WCF-Clientproxy enthalten ist, und wählen Sie Dienstverweis> hinzufügen aus. Geben Sie im Dialogfeld Dienstverweis hinzufügen die URL des Diensts ein, den Sie aufrufen möchten, und klicken Sie auf die Schaltfläche Gehe zu. Das Dialogfeld zeigt eine Liste der Dienste an, die unter der Adresse verfügbar sind. Doppelklicken Sie auf den Dienst, um die verfügbaren Verträge und Vorgänge anzuzeigen, geben Sie einen Namespace für den generierten Code an, und klicken Sie auf die Schaltfläche OK.

Beispiel

Im folgenden Codebeispiel wird ein für einen Dienst erstellter Dienstvertrag gezeigt.

// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    // Other methods are not shown here.
}
' Define a service contract.
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
    <OperationContract()>  _
    Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
    ' Other methods are not shown here.
End Interface

Das ServiceModel Metadata Utility-Tool und Dienstverweis hinzufügen in Visual Studio generieren die folgende WCF-Clientklasse. Die Klasse erbt von der generischen ClientBase<TChannel>-Klasse und implementiert die ICalculator-Schnittstelle. Das Tool generiert auch die ICalculator-Schnittstelle (wird hier nicht gezeigt).

public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
{
    public CalculatorClient()
    {}

    public CalculatorClient(string endpointConfigurationName) :
            base(endpointConfigurationName)
    {}

    public CalculatorClient(string endpointConfigurationName, string remoteAddress) :
            base(endpointConfigurationName, remoteAddress)
    {}

    public CalculatorClient(string endpointConfigurationName,
        System.ServiceModel.EndpointAddress remoteAddress) :
            base(endpointConfigurationName, remoteAddress)
    {}

    public CalculatorClient(System.ServiceModel.Channels.Binding binding,
        System.ServiceModel.EndpointAddress remoteAddress) :
            base(binding, remoteAddress)
    {}

    public double Add(double n1, double n2)
    {
        return base.Channel.Add(n1, n2);
    }
}
Partial Public Class CalculatorClient
    Inherits System.ServiceModel.ClientBase(Of ICalculator)
    Implements ICalculator

    Public Sub New()
        MyBase.New
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String)
        MyBase.New(endpointConfigurationName)
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String,
        ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub

    Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding,
        ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(binding, remoteAddress)
    End Sub

    Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
        Implements ICalculator.Add
        Return MyBase.Channel.Add(n1, n2)
    End Function
End Class

Verwenden des WCF-Clients

Erstellen Sie zum Verwenden des WCF-Clients eine Instanz des WCF-Clients, und rufen Sie dann seine Methoden auf, wie im folgenden Code gezeigt.

// Create a client object with the given client endpoint configuration.
CalculatorClient calcClient = new CalculatorClient("CalculatorEndpoint");
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = calcClient.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
' Create a client object with the given client endpoint configuration.
Dim calcClient As CalculatorClient = _
New CalculatorClient("CalculatorEndpoint")

' Call the Add service operation.
Dim value1 As Double = 100.00D
Dim value2 As Double = 15.99D
Dim result As Double = calcClient.Add(value1, value2)
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)

Debuggen der von einem Client ausgelösten Ausnahmen

Viele von einem WCF-Client ausgelöste Ausnahmen werden von einer Ausnahme des Diensts verursacht. Einige Beispiele:

  • SocketException: Vom Remotehost wurde die Schließung einer bestehenden Verbindung erzwungen.

  • CommunicationException: Die zugrunde liegende Verbindung wurde unerwartet geschlossen.

  • CommunicationObjectAbortedException: Die Socketverbindung wurde abgebrochen. Mögliche Ursache: Ein Fehler beim Verarbeiten der Nachricht, eine Zeitüberschreitung durch den Remotehost beim Empfang oder ein Problem mit einer zugrunde liegenden Netzwerkressource.

Tritt eine Ausnahme dieses Typs auf, aktivieren Sie die Ablaufverfolgung auf der Dienstseite, und ermitteln Sie die dort aufgetretene Ausnahme. Weitere Informationen zur Ablaufverfolgung finden Sie unter "Ablaufverfolgung " und "Verwenden der Ablaufverfolgung", um Ihre Anwendung zu beheben.

Siehe auch