Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Klientské aplikace musí vytvářet, konfigurovat a používat objekty klienta nebo kanálu WCF ke komunikaci se službami. Téma Přehled klienta WCF poskytuje přehled objektů a kroků, které se týkají vytváření základních objektů klienta a kanálu a jejich použití.
Toto téma obsahuje podrobné informace o některých problémech s klientskými aplikacemi a objekty klientů a kanálů, které můžou být užitečné v závislosti na vašem scénáři.
Přehled
Toto téma popisuje chování a problémy související s:
Doba trvání kanálů a relací
Zpracování výjimek
Vysvětlení blokujících problémů
Inicializace kanálů interaktivně
Životnost kanálů a relací
Aplikace WCF (Windows Communication Foundation) zahrnují dvě kategorie kanálů, datagramové a s relací.
Kanál datagramu je kanál, ve kterém všechny zprávy nesouvisejí. Pokud v kanálu datagramu selže vstupní nebo výstupní operace, další operace je obvykle nedotknutá a stejný kanál je možné znovu použít. Z tohoto důvodu kanály datagramu nebývají poruchové.
Kanály se stavovými relacemi jsou kanály, ale s připojením k druhému koncovému bodu. Zprávy v rámci jedné relace na jedné straně jsou vždy spojené se stejnou relací na druhé straně. Oba účastníci relace navíc musí souhlasit s tím, že požadavky jejich konverzace byly splněny, aby byla tato relace považována za úspěšnou. Pokud se nemohou dohodnout, může dojít k chybě kanálu s relacemi.
Otevřete klienty explicitně nebo implicitně voláním první operace.
Poznámka:
Pokus o explicitní detekci chybných kanálů relace není obvykle užitečný, protože když budete upozorněni, závisí na implementaci relace. Například proto, že System.ServiceModel.NetTcpBinding (s vypnutou spolehlivou relací) zobrazuje relaci připojení TCP, pokud sledujete událost ICommunicationObject.Faulted na službě nebo klientovi, budete pravděpodobně rychle upozorněni v případě selhání sítě. Spolehlivé relace (vytvořené vazbami, ve kterých System.ServiceModel.Channels.ReliableSessionBindingElement je povoleno) jsou však navrženy k izolaci služeb před malými selháními sítě. Pokud lze relaci znovu navázat během přiměřeného časového období, nemusí být stejná vazba nakonfigurovaná pro spolehlivé relace závadou, dokud přerušení nepřetrvá delší dobu.
Většina systémových vazeb, které ve výchozím nastavení zpřístupňují kanály aplikační vrstvě, používá relace, ale System.ServiceModel.BasicHttpBinding nikoli. Další informace naleznete v tématu Použití relací.
Správné používání relací
Relace poskytují způsob, jak zjistit, zda je výměna zpráv úplná a zda ji obě strany považují za úspěšnou. Doporučuje se, aby volající aplikace otevřela kanál, používala ho a zavřela kanál uvnitř jednoho bloku try. Pokud je kanál relace otevřený a ICommunicationObject.Close metoda je zavolána jednou, a toto volání proběhne úspěšně, relace byla úspěšná. V případě úspěchu to znamená, že byly splněny všechny záruky doručení podle zadané vazby, a druhá strana nezavolala na kanál ICommunicationObject.Abort před voláním Close.
Následující část obsahuje příklad tohoto přístupu klienta.
Zpracování výjimek
Zpracování výjimek v klientských aplikacích je jednoduché. Pokud je kanál otevřen, používán a uzavřen uvnitř bloku try, konverzace byla úspěšná, pokud není vyvolána výjimka. Obvykle je-li vyvolána výjimka konverzace je přerušena.
Poznámka:
using Použití příkazu (Usingv jazyce Visual Basic) se nedoporučuje. Důvodem je to, že konec using příkazu může způsobit výjimky, které mohou maskovat jiné výjimky, o kterých možná potřebujete vědět. Další informace naleznete v tématu Použití příkazů Zavřít a Přerušit k uvolnění prostředků klienta WCF.
Následující příklad kódu ukazuje doporučený vzor klienta pomocí bloku try/catch, a ne příkazu 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
Poznámka:
Kontrola hodnoty ICommunicationObject.State vlastnosti je časová podmínka a nedoporučuje se určit, zda se má kanál znovu použít nebo zavřít.
Kanály datagramu nikdy neselhávají, i když při jejich zavření dojde k výjimkám. Kromě toho neduplexní klienti, kteří se neověří pomocí zabezpečené konverzace, obvykle vyvolají System.ServiceModel.Security.MessageSecurityException. V případě, že se duplexnímu klientovi používajícímu zabezpečenou konverzaci nepodaří ověřit uživatele, klient místo toho obdrží System.TimeoutException.
Podrobnější informace o práci s informacemi o chybách na úrovni aplikace naleznete v tématu Určení a zpracování chyb v kontraktech a službách. Očekávané výjimky popisují očekávané výjimky a ukazují, jak je zpracovat. Další informace o zpracování chyb při vývoji kanálů naleznete v tématu Zpracování výjimek a chyb.
Blokování a výkon klienta
Když aplikace synchronně volá operaci žádosti a odpovědi, klient zablokuje, dokud se neobdrží návratová hodnota nebo se vyvolá výjimka (například System.TimeoutException) . Toto chování je podobné místnímu chování. Když aplikace synchronně vyvolá operaci na objektu klienta WCF nebo kanálu, klient se nevrátí, dokud vrstva kanálu nebude moct zapisovat data do sítě nebo dokud nedojde k výjimce. I když jednosměrný způsob výměny zpráv (určený označením operace s OperationContractAttribute.IsOneWay nastaveným na true) může zvýšit odezvu některých klientů, jednosměrné operace mohou také blokovat v závislosti na vazbě a na tom, jaké zprávy už byly odeslány. Jednosměrné operace se týkají pouze výměny zpráv, ne více a méně. Další informace najdete v tématu One-Way Services.
Velké datové bloky můžou zpomalit zpracování klientů bez ohledu na to, jaký je vzor výměny zpráv. Informace o tom, jak tyto problémy vyřešit, najdete v tématu Velké objemy dat a streamování.
Pokud vaše aplikace musí během dokončení operace provádět více práce, měli byste vytvořit dvojici asynchronních metod v rozhraní kontraktu služby, které váš klient WCF implementuje. Nejjednodušší způsob, jak to provést, je použít /async přepínač na nástroji ServiceModel Metadata Utility (Svcutil.exe). Pro více informací se podívejte na příklad Jak: Volat operace služby asynchronně.
Další informace o zvýšení výkonu klienta naleznete v tématu Middle-Tier Klientské aplikace.
Povolení dynamického výběru přihlašovacích údajů uživateli
Rozhraní IInteractiveChannelInitializer umožňuje aplikacím zobrazit uživatelské rozhraní, které uživateli umožňuje zvolit přihlašovací údaje, se kterými se kanál vytvoří před spuštěním časovačů časového limitu.
Vývojáři aplikací můžou použít vložený IInteractiveChannelInitializer soubor dvěma způsoby. Klientská aplikace může před otevřením kanálu (ClientBase<TChannel>.DisplayInitializationUI přístupem) volat buď IClientChannel.DisplayInitializationUI nebo (nebo asynchronní verzi), nebo volat první operaci (implicitní přístup).
Pokud používáte implicitní přístup, musí aplikace volat první operaci na ClientBase<TChannel> nebo IClientChannel rozšíření. Pokud se volá jiná operace než první, vyvolá se výjimka.
Pokud používáte explicitní přístup, musí aplikace provést následující kroky v pořadí:
Volejte buď ClientBase<TChannel>.DisplayInitializationUI nebo IClientChannel.DisplayInitializationUI (nebo asynchronní verzi).
Když se inicializátory vrátí, zavolejte metodu Open na objektu IClientChannel nebo na objektu IClientChannel vráceném z vlastnosti ClientBase<TChannel>.InnerChannel.
Operace volání
Doporučuje se, aby aplikace v produkční kvalitě kontrolují proces uživatelského rozhraní přijetím explicitního přístupu.
Aplikace, které používají implicitní přístup, vyvolávají inicializátory uživatelského rozhraní, ale pokud uživatel aplikace nereaguje do vypršení časového limitu odeslání vazby, vyvolá se výjimka, když se uživatelské rozhraní vrátí.