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 (Using
a 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.IsOneWaytrue
van 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:
Hívás vagy ClientBase<TChannel>.DisplayInitializationUIIClientChannel.DisplayInitializationUI (vagy aszinkron verzió).
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.
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
- Kétoldalas szolgáltatások
- Útmutató: Szolgáltatások elérése egyirányú és kérés-válasz szerződésekkel
- Útmutató: Szolgáltatások elérése kétoldalas szerződéssel
- Útmutató: W Standard kiadás 3.0-s szolgáltatás elérése
- Útmutató: A ChannelFactory használata
- Útmutató: A szolgáltatásműveletek aszinkron meghívása
- Közepes szintű ügyfélalkalmazások