Freigeben über


Zugreifen auf Dienste mithilfe eines WCF-Clients

Nachdem Sie einen Dienst erstellt haben, besteht der nächste Schritt darin, einen WCF-Clientproxy zu erstellen. Eine Clientanwendung verwendet den WCF-Clientproxy für die Kommunikation mit dem Dienst. Clientanwendungen importieren in der Regel die Metadaten eines Diensts, um WCF-Clientcode zu generieren, der zum Aufrufen des Diensts verwendet werden kann.

Die grundlegenden Schritte zum Erstellen eines WCF-Clients umfassen Folgendes:

  1. Kompilieren sie den Dienstcode.

  2. Generieren Sie den WCF-Clientproxy.

  3. Instanziieren Sie den WCF-Clientproxy.

Der WCF-Clientproxy kann manuell mithilfe des ServiceModel Metadata Utility Tools (SvcUtil.exe) generiert werden. Für weitere Informationen siehe ServiceModel Metadata Utility Tool (Svcutil.exe). Der WCF-Clientproxy kann auch in Visual Studio mithilfe des Features " Dienstreferenz hinzufügen " generiert werden. Um den WCF-Clientproxy mithilfe einer der Methoden zu generieren, muss der Dienst ausgeführt werden. Wenn der Dienst selbst gehostet wird, müssen Sie den Server ausführen. Wenn der Dienst in IIS/WAS gehostet wird, müssen Sie nichts anderes tun.

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 einfachen Svcutil.exe-Befehl.

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

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

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

Das Ergebnis ist eine Codedatei, die WCF-Clientcode enthält, den die Clientanwendung zum Aufrufen des Diensts verwenden kann.

Sie können das Tool auch verwenden, um Konfigurationsdateien zu generieren.

Svcutil.exe <file1 [,file2]>

Wenn nur ein Dateiname angegeben wird, ist dies der Name der Ausgabedatei. Wenn zwei Dateinamen angegeben werden, handelt es sich bei der ersten Datei um 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.

Von Bedeutung

Ungesicherte Metadatenanforderungen bergen bestimmte Risiken, ebenso wie jede ungesicherte Netzwerkanforderung: Wenn Sie nicht sicher sind, ob der Endpunkt, mit dem Sie kommunizieren, tatsächlich der ist, für den er sich ausgibt, könnten die von Ihnen abgerufenen Informationen Metadaten eines bösartigen Dienstes sein.

Dienstreferenz in Visual Studio hinzufügen

Wenn der Dienst ausgeführt wird, klicken Sie mit der rechten Maustaste auf das Projekt, das den WCF-Clientproxy enthält, und wählen Sie "Dienstverweis> aus. Geben Sie im Dialogfeld "Dienstreferenz hinzufügen" die URL zu dem Dienst ein, den Sie aufrufen möchten, und klicken Sie auf die Schaltfläche " Gehe zu". Im Dialogfeld wird eine Liste der dienste angezeigt, die an der von Ihnen angegebenen 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

Das folgende Codebeispiel zeigt einen Dienstvertrag, der für einen Dienst erstellt wurde.

// 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 Hilfsprogramm "ServiceModel Metadata" und "Dienstverweis hinzufügen " in Visual Studio generiert 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 (hier nicht dargestellt).

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

Um den WCF-Client zu verwenden, erstellen Sie eine Instanz des WCF-Clients, und rufen Sie dann die 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 von Ausnahmen, die von einem Client ausgelöst werden

Viele Ausnahmen, die von einem WCF-Client ausgelöst werden, werden durch eine Ausnahme des Diensts verursacht. Einige Beispiele:

  • SocketException: Eine vorhandene Verbindung wurde vom Remote-Host zwangsweise geschlossen.

  • CommunicationException: Die zugrunde liegende Verbindung wurde unerwartet geschlossen.

  • CommunicationObjectAbortedException: Die Socketverbindung wurde abgebrochen. Dies kann durch einen Fehler bei der Verarbeitung Ihrer Nachricht, einem Empfangstimeout verursacht werden, das vom Remotehost oder einem zugrunde liegenden Netzwerkressourcenproblem überschritten wird.

Wenn diese Arten von Ausnahmen auftreten, besteht die beste Möglichkeit zum Beheben des Problems darin, die Ablaufverfolgung auf der Dienstseite zu aktivieren und zu bestimmen, welche Ausnahme dort aufgetreten ist. Weitere Informationen zur Ablaufverfolgung finden Sie unter "Ablaufverfolgung " und "Verwenden der Ablaufverfolgung zur Problembehandlung Ihrer Anwendung".

Siehe auch