Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 /async
ServiceModel 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:
Hívja a ClientBase<TChannel>.DisplayInitializationUI vagy a IClientChannel.DisplayInitializationUI (vagy egy aszinkron verziót).
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.
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
- Kétoldalas szolgáltatások
- Útmutató: Szolgáltatások elérése One-Way és Request-Reply szerződésekkel
- Útmutató: Szolgáltatások elérése kétoldalas szerződéssel
- Útmutató: WSE 3.0-szolgáltatás elérése
- Útmutató: A ChannelFactory használata
- Útmutató: A szolgáltatásműveletek aszinkron meghívása
- Middle-Tier Ügyfélalkalmazások