Delen via


Toegang tot services met behulp van een client

Clienttoepassingen moeten WCF-client- of kanaalobjecten maken, configureren en gebruiken om te communiceren met services. Het onderwerp Overzicht van WCF-clients biedt een overzicht van de objecten en stappen voor het maken van basisclient- en kanaalobjecten en het gebruik ervan.

Dit onderwerp bevat uitgebreide informatie over enkele van de problemen met clienttoepassingen en client- en kanaalobjecten die mogelijk nuttig zijn, afhankelijk van uw scenario.

Overzicht

In dit onderwerp worden gedrag en problemen met betrekking tot:

  • Levensduur van kanalen en sessies.

  • Uitzonderingen verwerken.

  • Informatie over blokkerende problemen.

  • Kanalen interactief initialiseren.

Levensduur van kanaal en sessie

WCF-toepassingen (Windows Communication Foundation) bevatten twee categorieën kanalen, datagram en sessionful.

Een datagramkanaal is een kanaal waarin alle berichten niet gerelateerd zijn. Als een invoer- of uitvoerbewerking mislukt met een datagramkanaal, wordt de volgende bewerking doorgaans niet beïnvloed en kan hetzelfde kanaal opnieuw worden gebruikt. Daarom maken datagramkanalen doorgaans geen fouten.

Sessionful-kanalen zijn echter kanalen met een verbinding met het andere eindpunt. Berichten in een sessie aan de ene kant worden altijd gecorreleerd met dezelfde sessie aan de andere kant. Bovendien moeten beide deelnemers aan een sessie ermee akkoord gaan dat aan de vereisten van hun gesprek is voldaan om die sessie als succesvol te beschouwen. Als ze het niet eens kunnen zijn, kan het sessieful kanaal fouten geven.

Open clients expliciet of impliciet door de eerste bewerking aan te roepen.

Notitie

Het expliciet detecteren van mislukte sessieful kanalen is meestal niet nuttig, omdat wanneer u een melding ontvangt, afhankelijk is van de sessie-implementatie. Bijvoorbeeld, omdat de System.ServiceModel.NetTcpBinding (met de betrouwbare sessie uitgeschakeld) de sessie van de TCP-verbinding weergeeft, als u luistert naar de gebeurtenis in de ICommunicationObject.Faulted service of de client, wordt u waarschijnlijk snel op de hoogte gesteld in het geval van een netwerkfout. Maar betrouwbare sessies (ingesteld door bindingen waarin de System.ServiceModel.Channels.ReliableSessionBindingElement functie is ingeschakeld) zijn ontworpen om services te isoleren van kleine netwerkfouten. Als de sessie binnen een redelijke periode kan worden hersteld, kan dezelfde binding, die is geconfigureerd voor betrouwbare sessies, mogelijk geen fouten opleveren totdat de onderbreking langere tijd voortduurt.

De meeste door het systeem geleverde bindingen (die kanalen beschikbaar maken voor de toepassingslaag) maken standaard gebruik van sessies, maar dat System.ServiceModel.BasicHttpBinding is niet het geval. Zie Sessies gebruiken voor meer informatie.

Het juiste gebruik van sessies

Sessies bieden een manier om te weten of de volledige berichtuitwisseling is voltooid en of beide zijden het succesvol vonden. Het wordt aanbevolen dat een aanroepende toepassing het kanaal opent, het gebruikt en het kanaal sluit in één pogingsblok. Als een sessiekanaal is geopend en de ICommunicationObject.Close methode eenmaal wordt aangeroepen en die aanroep is geretourneerd, is de sessie geslaagd. In dit geval betekent dit dat aan alle leveringsgaranties is voldaan waaraan de opgegeven binding is voldaan, en de andere kant niet heeft aangeroepen voordat het kanaal werd aangeroepen ICommunicationObject.AbortClose.

In de volgende sectie ziet u een voorbeeld van deze clientbenadering.

Uitzonderingen verwerken

Het verwerken van uitzonderingen in clienttoepassingen is eenvoudig. Als een kanaal wordt geopend, gebruikt en gesloten binnen een try-blok, is het gesprek geslaagd, tenzij er een uitzondering wordt gegenereerd. Als er een uitzondering optreedt, wordt het gesprek afgebroken.

Notitie

Het gebruik van de using instructie (Using in Visual Basic) wordt niet aanbevolen. Dit komt doordat het einde van de using instructie uitzonderingen kan veroorzaken die andere uitzonderingen kunnen maskeren die u mogelijk moet weten. Zie Close and Abort gebruiken om WCF-clientresources vrij te geven voor meer informatie.

In het volgende codevoorbeeld ziet u het aanbevolen clientpatroon met behulp van een try/catch-blok en niet de using instructie.

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

Notitie

Het controleren van de waarde van de ICommunicationObject.State eigenschap is een racevoorwaarde en wordt niet aanbevolen om te bepalen of een kanaal opnieuw moet worden gebruikt of gesloten.

Datagramkanalen maken nooit fouten, zelfs als er uitzonderingen optreden wanneer ze worden gesloten. Bovendien gooien niet-duplex clients die niet verifiëren met behulp van een beveiligd gesprek meestal een System.ServiceModel.Security.MessageSecurityException. Als de duplex-client die gebruikmaakt van een beveiligd gesprek, echter niet kan worden geverifieerd, ontvangt de client een System.TimeoutException in plaats daarvan.

Zie Fouten opgeven en verwerken in contracten en services voor meer informatie over het werken met foutinformatie op toepassingsniveau. Verwachte uitzonderingen beschrijven de verwachte uitzonderingen en laten zien hoe ze moeten worden verwerkt. Zie Uitzonderingen en fouten afhandelen voor meer informatie over het afhandelen van fouten bij het ontwikkelen van kanalen.

Clientblokkering en prestaties

Wanneer een toepassing synchroon een aanvraag-antwoordbewerking aanroept, wordt de client geblokkeerd totdat een retourwaarde wordt ontvangen of een uitzondering (zoals een System.TimeoutException) wordt gegenereerd. Dit gedrag is vergelijkbaar met lokaal gedrag. Wanneer een toepassing synchroon een bewerking aanroept op een WCF-clientobject of -kanaal, retourneert de client pas wanneer de kanaallaag de gegevens naar het netwerk kan schrijven of totdat er een uitzondering wordt gegenereerd. En hoewel het eenrichtingspatroon voor het uitwisselen van berichten (opgegeven door het markeren van een bewerking met OperationContractAttribute.IsOneWay ingesteld op true) sommige clients responsiefer kan maken, kunnen bewerkingen in één richting ook worden geblokkeerd, afhankelijk van de binding en welke berichten al zijn verzonden. Eenrichtingsbewerkingen gaan alleen over de berichtenuitwisseling, niet meer en niet minder. Zie One-Way Services voor meer informatie.

Grote gegevenssegmenten kunnen de verwerking van clients vertragen, ongeacht het berichtuitwisselingspatroon. Als u wilt weten hoe u deze problemen kunt afhandelen, raadpleegt u Large Data en Streaming.

Als uw toepassing meer werk moet doen terwijl een bewerking is voltooid, moet u een asynchroon methodepaar maken op de servicecontractinterface die door uw WCF-client wordt geïmplementeerd. De eenvoudigste manier om dit te doen, is door de /async schakeloptie te gebruiken voor het hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe). Zie Procedure voor een voorbeeld : Servicebewerkingen asynchroon aanroepen.

Zie Clienttoepassingen in de middelste laag voor meer informatie over het verhogen van de clientprestaties.

De gebruiker inschakelen om referenties dynamisch te selecteren

Met IInteractiveChannelInitializer de interface kunnen toepassingen een gebruikersinterface weergeven waarmee de gebruiker referenties kan kiezen waarmee een kanaal wordt gemaakt voordat de time-outtimers worden gestart.

Toepassingsontwikkelaars kunnen op twee manieren gebruikmaken van een ingevoegde IInteractiveChannelInitializer toepassing. De clienttoepassing kan een of IClientChannel.DisplayInitializationUI (of een asynchrone versie) aanroepen voordat het kanaal (de expliciete benadering) wordt geopend of de eerste bewerking aanroepen ClientBase<TChannel>.DisplayInitializationUI (de impliciete benadering).

Als u de impliciete benadering gebruikt, moet de toepassing de eerste bewerking op een ClientBase<TChannel> of IClientChannel extensie aanroepen. Als er iets anders wordt aanroepen dan de eerste bewerking, wordt er een uitzondering gegenereerd.

Als u de expliciete benadering gebruikt, moet de toepassing de volgende stappen in de volgende volgorde uitvoeren:

  1. ClientBase<TChannel>.DisplayInitializationUI Aanroepen of IClientChannel.DisplayInitializationUI (of een asynchrone versie).

  2. Wanneer de initialisatiefuncties zijn geretourneerd, roept u de Open methode voor het IClientChannel object aan of op het IClientChannel object dat wordt geretourneerd vanuit de ClientBase<TChannel>.InnerChannel eigenschap.

  3. Oproepbewerkingen.

Het wordt aanbevolen dat toepassingen van productiekwaliteit het gebruikersinterfaceproces beheren door de expliciete benadering te gebruiken.

Toepassingen die gebruikmaken van de impliciete benadering roepen de initialisatieprogramma's van de gebruikersinterface aan, maar als de gebruiker van de toepassing niet reageert binnen de time-outperiode voor verzenden van de binding, wordt er een uitzondering gegenereerd wanneer de gebruikersinterface wordt geretourneerd.

Zie ook