Sdílet prostřednictvím


Přístup ke službám pomocí klienta

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:

  • Životnost 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ů, datagramu a relace.

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 obvykle nemají chybu.

Kanály s relacemi jsou ale kanály s připojením k druhému koncovému bodu. Zprávy v relaci na jedné straně vždy korelují 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 nemůžou souhlasit, může dojít k chybě kanálu relace.

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 vzhledem k tomu, že System.ServiceModel.NetTcpBinding relace (se zakázanou spolehlivou relací) zobrazí relaci připojení TCP, pokud nasloucháte ICommunicationObject.Faulted události ve službě nebo klientovi, u které pravděpodobně budete upozorněni rychle 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 se relace může znovu publikovat během přiměřeného časového období, nemusí být stejná vazba nakonfigurovaná pro spolehlivé relace chybná, dokud přerušení po delší dobu nepřetrvá.

Většina systémových vazeb (které zpřístupňují kanály aplikační vrstvě) ve výchozím nastavení používá relace, ale System.ServiceModel.BasicHttpBinding ne. Další informace naleznete v tématu Použití relací.

Správné používání relací

Relace poskytují způsob, jak zjistit, jestli je úplná výměna zpráv, a pokud obě strany považovaly za úspěšné. 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 se volá jednou a toto volání se úspěšně vrátí, relace byla úspěšná. V tomto případě úspěch znamená, že všechny záruky doručení zadané vazby byly splněny a druhá strana nezavolala ICommunicationObject.Abort kanál 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říkazu Zavřít a přerušit k vydá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 nevyužívají chybu, i když dojde k výjimkám při jejich zavření. Kromě toho ne duplexní klienti, kteří se nepodaří ověřit pomocí zabezpečené konverzace obvykle vyvolat System.ServiceModel.Security.MessageSecurityException. Pokud se ale duplexní klient používající zabezpečenou konverzaci nepodaří ověřit, 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. A zatímco jednosměrný způsob výměny zpráv (určený označením operace s OperationContractAttribute.IsOneWay nastavenou truehodnotou) může některým klientům usnadnit odezvu, jednosměrné operace můžou 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 Jednosměrné služby.

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 udělat, je použít /async přepínač nástroje ServiceModel Metadata Utility (Svcutil.exe). Příklad: Volání operací služby asynchronně.

Další informace o zvýšení výkonu klienta naleznete v tématu Klientské aplikace střední vrstvy.

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 (explicitním přístupem) volat buď ClientBase<TChannel>.DisplayInitializationUI nebo IClientChannel.DisplayInitializationUI (nebo asynchronní verzi), nebo volat první operaci (implicitní přístup).

Pokud používáte implicitní přístup, musí aplikace volat první operaci v ClientBase<TChannel> nějakém rozšíření.IClientChannel Pokud volá cokoli jiného, než je první operace, vyvolá se výjimka.

Pokud používáte explicitní přístup, musí aplikace provést následující kroky v pořadí:

  1. Volejte buď ClientBase<TChannel>.DisplayInitializationUI nebo IClientChannel.DisplayInitializationUI (nebo asynchronní verzi).

  2. Když se inicializátory vrátí, zavolejte metodu Open objektu IClientChannel nebo IClientChannel objektu vráceného ClientBase<TChannel>.InnerChannel z vlastnosti.

  3. 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, vyvolat inicializátory uživatelského rozhraní, ale pokud uživatel aplikace nereaguje v době vypršení časového limitu odeslání vazby, vyvolá se výjimka, když uživatelské rozhraní vrátí.

Viz také