Delen via


Toegang tot services met behulp van een WCF-client

Nadat u een service hebt gemaakt, bestaat de volgende stap uit het maken van een WCF-clientproxy. Een clienttoepassing maakt gebruik van de WCF-clientproxy om te communiceren met de service. Clienttoepassingen importeren meestal de metagegevens van een service om WCF-clientcode te genereren die kan worden gebruikt om de service aan te roepen.

De basisstappen voor het maken van een WCF-client zijn onder andere:

  1. Compileer de servicecode.

  2. Genereer de WCF-clientproxy.

  3. Instantieer de WCF-clientproxy.

De WCF-clientproxy kan handmatig worden gegenereerd met behulp van het hulpprogramma voor metagegevens van het servicemodel (SvcUtil.exe) voor meer informatie. Zie Het hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) voor meer informatie. De WCF-clientproxy kan ook worden gegenereerd in Visual Studio met behulp van de functie Servicereferentie toevoegen. Als u de WCF-clientproxy wilt genereren met behulp van een van beide methoden, moet de service worden uitgevoerd. Als de service zelf wordt gehost, moet u de host uitvoeren. Als de service wordt gehost in IIS/WAS, hoeft u niets anders te doen.

Hulpprogramma voor metagegevens van ServiceModel

Het hulpprogramma voor servicemodelmetagegevens (Svcutil.exe) is een opdrachtregelprogramma voor het genereren van code op basis van metagegevens. Het volgende gebruik is een voorbeeld van een eenvoudige Svcutil.exe opdracht.

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

U kunt ook Svcutil.exe gebruiken met WSDL-bestanden (Web Services Description Language) en XSD-bestanden (XML Schema Definition Language) in het bestandssysteem.

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

Het resultaat is een codebestand dat WCF-clientcode bevat die de clienttoepassing kan gebruiken om de service aan te roepen.

U kunt het hulpprogramma ook gebruiken om configuratiebestanden te genereren.

Svcutil.exe <file1 [,file2]>

Als er slechts één bestandsnaam wordt opgegeven, is dat de naam van het uitvoerbestand. Als er twee bestandsnamen worden opgegeven, is het eerste bestand een invoerconfiguratiebestand waarvan de inhoud wordt samengevoegd met de gegenereerde configuratie en wordt weggeschreven naar het tweede bestand. Zie Bindingen configureren voor services voor meer informatie over configuratie.

Belangrijk

Niet-beveiligde metagegevensaanvragen vormen bepaalde risico's op dezelfde manier als een onbeveiligde netwerkaanvraag doet: Als u niet zeker weet dat het eindpunt waarmee u communiceert, is wie het is, de informatie die u ophaalt mogelijk metagegevens van een kwaadwillende service.

Servicereferentie toevoegen in Visual Studio

Wanneer de service wordt uitgevoerd, klikt u met de rechtermuisknop op het project dat de WCF-clientproxy bevat en selecteert u Servicereferentie toevoegen>. Typ in het dialoogvenster Servicereferentie toevoegen de URL naar de service die u wilt aanroepen en klik op de knop Start . In het dialoogvenster wordt een lijst met services weergegeven die beschikbaar zijn op het adres dat u opgeeft. Dubbelklik op de service om de beschikbare contracten en bewerkingen weer te geven, geef een naamruimte op voor de gegenereerde code en klik op de knop OK .

Opmerking

In het volgende codevoorbeeld ziet u een servicecontract dat is gemaakt voor een service.

// 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

Het hulpprogramma servicemodelmetagegevens en servicereferentie toevoegen in Visual Studio genereert de volgende WCF-clientklasse. De klasse neemt over van de algemene ClientBase<TChannel> klasse en implementeert de ICalculator interface. Het hulpprogramma genereert ook de ICalculator interface (niet hier weergegeven).

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

De WCF-client gebruiken

Als u de WCF-client wilt gebruiken, maakt u een exemplaar van de WCF-client en roept u de bijbehorende methoden aan, zoals wordt weergegeven in de volgende code.

// 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)

Foutopsporingsuitzondering veroorzaakt door een client

Veel uitzonderingen die worden gegenereerd door een WCF-client, worden veroorzaakt door een uitzondering op de service. Enkele voorbeelden hiervan zijn:

  • SocketException: Een bestaande verbinding is geforceerd gesloten door de externe host.

  • CommunicationException: De onderliggende verbinding is onverwacht gesloten.

  • CommunicationObjectAbortedException: De socketverbinding is afgebroken. Dit kan worden veroorzaakt door een fout bij het verwerken van uw bericht, een time-out voor ontvangst die wordt overschreden door de externe host of een onderliggende netwerkresourceprobleem.

Wanneer deze soorten uitzonderingen optreden, kunt u het probleem het beste oplossen door tracering aan de servicezijde in te schakelen en te bepalen welke uitzondering zich daar heeft voorgedaan. Zie Tracering en tracering gebruiken om problemen met uw toepassing op te lossen voor meer informatie over tracering.

Zie ook