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 tartalmaznak, a datagramot és a munkamenet-alapút.

A datagram-csatorna olyan csatorna, amelyben az összes üzenet nem javítva van. 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 módon vagy implicit módon az első művelet meghívásával.

Feljegyzé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. A megbízható munkamenetek (amelyeket olyan kötések hoztak létre, amelyekben engedélyezve System.ServiceModel.Channels.ReliableSessionBindingElement van) azonban úgy vannak kialakítva, hogy elszigetelje 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 tesz elérhetővé az alkalmazásréteg számára) alapértelmezés szerint munkameneteket használnak, de nem System.ServiceModel.BasicHttpBinding . 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 kivétel esetén a beszélgetés megszakad.

Feljegyzés

Az utasítás használata (Usinga using Visual Basicben) 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éldában az ajánlott ügyfélminta egy próba-/fogási blokkot használ, nem pedig az utasítást using .

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

Feljegyzés

Az ingatlan értékének ICommunicationObject.State ellenőrzése versenyfeltétel, és nem ajánlott meghatározni, hogy újra felhasznál-e 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 a nem kétoldalas ügyfelek, amelyek nem hitelesíthetők biztonságos beszélgetéssel, általában egy System.ServiceModel.Security.MessageSecurityException. Ha azonban a biztonságos beszélgetést használó kétoldalas ügyfél hitelesítése nem sikerül, az ügyfél 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ása és teljesítménye

Amikor egy alkalmazás szinkron módon meghív egy kérés-válasz műveletet, az ügyfél letiltja a visszatérési érték beérkezéséig vagy kivétel (például a System.TimeoutException) ki nem dobásáig. 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 beállításával OperationContractAttribute.IsOneWaytruevan megadva) egyes ügyfeleket rugalmasabbá tehet, az egyirányú műveletek is blokkolhatók 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 /async ServiceModel Metadata Segédprogram kapcsolójának (Svcutil.exe) használata. Példa: A szolgáltatásműveletek aszinkron meghívása.

Az ügyfélteljesítmény növeléséről további információt a középső szintű ü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ívhat vagy ClientBase<TChannel>.DisplayInitializationUIIClientChannel.DisplayInitializationUI (vagy aszinkron verziót) a csatorna megnyitása előtt (explicit megközelítés), vagy meghívhatja az első műveletet (implicit megközelítést).

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 több bővítményen. Ha nem az első műveletet hívja meg, kivételt jelent.

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ívás vagy ClientBase<TChannel>.DisplayInitializationUIIClientChannel.DisplayInitializationUI (vagy aszinkron verzió).

  2. Amikor az inicializálók visszatértek, hívja meg az Open objektum metódusát IClientChannel vagy a IClientChannel tulajdonságból ClientBase<TChannel>.InnerChannel visszaadott objektumot.

  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 kötés küldési időtúllépési időszakán belül, a felhasználói felület visszatérése kivételt jelent.

Lásd még