Megosztás a következőn keresztül:


Szolgáltatások elérése ügyfél használatával

Az ügyfélalkalmazásoknak WCF-ügyfél- vagy csatornaobjektumokat kell létrehozniuk, konfigurálnia és használniuk a szolgáltatásokkal való kommunikációhoz. A WCF-ügyfél áttekintési témaköre áttekintést nyújt az alapszintű ügyfél- és csatornaobjektumok létrehozásához és használatukhoz szükséges objektumokról és lépésekről.

Ez a témakör részletes információkat nyújt az ügyfélalkalmazásokkal, valamint az ügyfél- és csatornaobjektumokkal kapcsolatos problémákról, amelyek a forgatókönyvtől függően hasznosak lehetnek.

Áttekintés

Ez a témakör a következőhöz kapcsolódó viselkedést és problémákat ismerteti:

  • Csatorna- és munkamenet-élettartamok.

  • Kivételek kezelése.

  • A blokkolási problémák ismertetése.

  • Csatornák interaktív inicializálása.

Csatorna- és munkamenet-élettartamok

A Windows Communication Foundation (WCF) alkalmazások két csatornakategóriát használnak: a datagram és a munkamenetes csatornákat.

A datagram-csatorna olyan csatorna, amelyben az összes üzenet független egymástól. Datagram-csatorna esetén, ha egy bemeneti vagy kimeneti művelet meghiúsul, a következő művelet általában nem változik, és ugyanazt a csatornát újra felhasználhatja. Emiatt a datagram-csatornák általában nem hibásak.

A munkamenet-alapú csatornák azonban olyan csatornák, amelyek kapcsolatban állnak a másik végponttal. Az egyik oldalon lévő munkamenet üzenetei mindig azonos munkamenettel vannak összefüggésben a másik oldalon. Emellett a munkamenet mindkét résztvevőjének meg kell egyeznie abban, hogy a beszélgetésük követelményei teljesültek ahhoz, hogy az adott munkamenet sikeresnek minősüljön. Ha nem tudnak megegyezni, a munkamenet-alapú csatorna hibás lehet.

Nyissa meg az ügyfeleket explicit vagy implicit módon az első művelet meghívásával.

Megjegyzés:

A hibás munkamenet-csatornák explicit észlelése általában nem hasznos, mert az értesítés a munkamenet implementációjától függ. Például azért, mert a System.ServiceModel.NetTcpBinding (le van tiltva a megbízható munkamenet) felfedi a TCP-kapcsolat munkamenetét, ha a szolgáltatáson vagy az ügyfélen figyeli ICommunicationObject.Faulted az eseményt, akkor hálózati hiba esetén valószínűleg gyorsan értesítést kap. Megbízható munkamenetek (amelyeket olyan kötések hoztak létre, ahol a System.ServiceModel.Channels.ReliableSessionBindingElement engedélyezve van) úgy vannak kialakítva, hogy elszigeteljék a szolgáltatásokat a kis hálózati hibáktól. Ha a munkamenet ésszerű időn belül újra létrejön, előfordulhat, hogy ugyanaz a kötés – megbízható munkamenetekhez konfigurálva – nem hibás, amíg a megszakítás hosszabb ideig nem folytatódik.

A rendszer által biztosított kötések többsége (amelyek csatornákat tesznek elérhetővé az alkalmazásréteg számára) alapértelmezés szerint munkameneteket használ, de a System.ServiceModel.BasicHttpBinding nem. További információ: Munkamenetek használata.

A munkamenetek megfelelő használata

A munkamenetek lehetővé teszik annak megismerését, hogy a teljes üzenetcsere befejeződött-e, és hogy mindkét fél sikeresnek találta-e. Javasoljuk, hogy egy hívó alkalmazás nyissa meg a csatornát, használja, és zárja be a csatornát egy próbablokkon belül. Ha egy munkamenet-csatorna meg van nyitva, és a ICommunicationObject.Close metódus egyszer van meghívva, és a hívás sikeresen visszajön, akkor a munkamenet sikeres volt. Ebben az esetben a sikeres kézbesítés azt jelenti, hogy a megadott kötés teljesült, a másik oldal pedig nem hívott ICommunicationObject.Abort a csatornán a hívás Closeelőtt.

Az alábbi szakasz erre az ügyfél-megközelítésre mutat be példát.

Kivételek kezelése

A kivételek kezelése az ügyfélalkalmazásokban egyszerű. Ha a rendszer megnyit, használ és bezár egy csatornát egy próbablokkon belül, akkor a beszélgetés sikeres volt, kivéve, ha kivételt jelez. Általában, ha kivétel fordul elő, a beszélgetés megszakad.

Megjegyzés:

A using utasítás (Using a Visual Basicben) használata nem ajánlott. Ennek az az oka, hogy az utasítás vége using olyan kivételeket okozhat, amelyek elfedhetik az egyéb kivételeket, amelyekről esetleg tudnia kell. További információ: WCF-ügyfélerőforrások felszabadítása a Bezárás és megszakítás használatával.

Az alábbi kódpélda az ajánlott kliensemintát mutatja be egy try/catch blokk használatával, nem pedig a using utasítással.

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

Megjegyzés:

A ICommunicationObject.State tulajdonság értékének ellenőrzése versenyhelyzetet teremt, és nem ajánlott annak meghatározására, hogy újra felhasználjon vagy bezárjon egy csatornát.

A Datagram-csatornák akkor sem hibásak, ha a kivételek akkor is előfordulnak, amikor bezárulnak. Emellett azok az egyirányú ügyfelek, amelyek nem tudnak biztonságos kapcsolattal hitelesíteni, tipikusan egy System.ServiceModel.Security.MessageSecurityException-t dobnak. Ha azonban a biztonságos beszélgetést használó duplex ügyfél nem tudja magát hitelesíteni, akkor ehelyett kap egy System.TimeoutException.

Az alkalmazásszintű hibainformációk kezelésével kapcsolatos további információkért lásd: Szerződések és szolgáltatások hibáinak megadása és kezelése. A várt kivételek ismertetik a várt kivételeket, és bemutatják azok kezelését. A csatornák fejlesztése során előforduló hibák kezeléséről további információt a Kivételek és hibák kezelése című témakörben talál.

Ügyfél blokkolás és teljesítmény

Amikor egy alkalmazás szinkron módon meghív egy kérés-válasz műveletet, az ügyfél blokkolódik, amíg meg nem érkezik a visszatérési érték, vagy amíg kivétel (például a System.TimeoutException) nem keletkezik. Ez a viselkedés hasonló a helyi viselkedéshez. Amikor egy alkalmazás szinkron módon meghív egy műveletet egy WCF-ügyfélobjektumon vagy -csatornán, az ügyfél addig nem tér vissza, amíg a csatornaréteg meg nem tudja írni az adatokat a hálózatba, vagy amíg kivételt nem okoz. Míg az egyirányú üzenetcsere mintája (amely egy művelet OperationContractAttribute.IsOneWaytrue értékbeállításával van megadva) egyes ügyfeleket reagálóképesebbé tehet, az egyirányú műveletek is blokkolódhatnak, a kötéstől és a már elküldött üzenetektől függően. Az egyirányú műveletek csak az üzenetcseréről szólnak, nem többről és nem kevesebbről. További információ: One-Way Services.

A nagy adattömbök az üzenetcsere mintájától függetlenül lelassíthatják az ügyfélfeldolgozást. A problémák kezelésének megismeréséhez tekintse meg a Nagyméretű adatok és a Streamelés című témakört.

Ha az alkalmazásnak több munkát kell végeznie egy művelet befejeződése közben, létre kell hoznia egy aszinkron metóduspárt a WCF-ügyfél által implementálandó szolgáltatási szerződési felületen. Ennek legegyszerűbb módja a /asyncServiceModel Metadata Segédprogram kapcsolójának használata (Svcutil.exe). Például lásd A szolgáltatásműveletek aszinkron meghívása.

Az ügyfélteljesítmény növeléséről további információt Middle-Tier Ügyfélalkalmazások című témakörben talál.

Hitelesítő adatok dinamikus kiválasztásának engedélyezése a felhasználó számára

Az IInteractiveChannelInitializer interfész lehetővé teszi, hogy az alkalmazások megjelenítsenek egy felhasználói felületet, amely lehetővé teszi a felhasználó számára, hogy olyan hitelesítő adatokat válasszon, amelyekkel a csatorna létrejön az időtúllépési időzítők megkezdése előtt.

Az alkalmazásfejlesztők kétféleképpen használhatják a beszúrt IInteractiveChannelInitializer fájlokat. Az ügyfélalkalmazás meghívhatja a ClientBase<TChannel>.DisplayInitializationUI vagy IClientChannel.DisplayInitializationUI összetevőket (vagy azok aszinkron verzióját) a csatorna megnyitása előtt (explicit megközelítés), vagy meghívhatja az első műveletet (implicit megközelítés).

Implicit megközelítés használata esetén az alkalmazásnak meg kell hívnia az első műveletet egy ClientBase<TChannel> vagy IClientChannel bővítményen. Ha nem az első műveletet hívja meg, kivételt dob.

Ha explicit megközelítést használ, az alkalmazásnak a következő lépéseket kell végrehajtania a következő sorrendben:

  1. Hívja a ClientBase<TChannel>.DisplayInitializationUI vagy a IClientChannel.DisplayInitializationUI (vagy egy aszinkron verziót).

  2. Amikor az inicializálók visszatértek, hívja meg az Open metódust az IClientChannel objektumon, vagy a IClientChannel tulajdonság által visszaadott ClientBase<TChannel>.InnerChannel objektumon.

  3. Hívási műveletek.

Javasoljuk, hogy az éles minőségű alkalmazások az explicit megközelítés alkalmazásával szabályozzák a felhasználói felület folyamatát.

Az implicit megközelítést használó alkalmazások meghívják a felhasználói felület inicializálóit, de ha az alkalmazás felhasználója nem válaszol a kapcsolat küldési időkorlátján belül, akkor a felhasználói felület visszatérésekor kivételt dobnak.

Lásd még