Sdílet prostřednictvím


Architektura klienta

Aplikace používají klientské objekty WCF (Windows Communication Foundation) k vyvolání operací služby. Toto téma popisuje objekty klienta WCF, kanály klienta WCF a jejich vztahy s základní architekturou kanálu. Základní přehled klientských objektů WCF najdete v tématu Přehled klienta WCF. Další informace o vrstvě kanálu naleznete v tématu Rozšíření vrstvy kanálu.

Přehled

Doba běhu modelu služby vytvoří klienty WCF, které se skládají z následujících:

  • Automaticky vygenerovaná klientská implementace kontraktu služby, která mění volání z kódu vaší aplikace na odchozí zprávy a převede zprávy odpovědí na výstupní parametry a návratové hodnoty, které může aplikace načíst.

  • Implementace řídicího rozhraní (System.ServiceModel.IClientChannel), která seskupuje různá rozhraní a poskytuje přístup k funkcím řízení, zejména schopnost zavřít relaci klienta a likvidovat kanál.

  • Klientský kanál, který je sestavený na základě nastavení konfigurace určeného použitou vazbou.

Aplikace mohou vytvářet takové klienty na vyžádání, buď prostřednictvím System.ServiceModel.ChannelFactory, nebo vytvořením instance ClientBase<TChannel> odvozené třídy, která je generována pomocí nástroje ServiceModel Metadata Utility Tool (Svcutil.exe). Tyto předem vytvořené třídy klienta zapouzdřují a delegují úkoly na implementaci klientského kanálu, která je dynamicky sestavena pomocí ChannelFactory. Kanál klienta a továrna na kanály, která je vytváří, jsou proto hlavním bodem zájmu této diskuse.

Klientské objekty a klientské kanály

Základní rozhraní klientů WCF je rozhraní System.ServiceModel.IClientChannel, které zpřístupňuje základní funkce klienta, funkce základního komunikačního objektu System.ServiceModel.ICommunicationObject, kontextové funkce System.ServiceModel.IContextChannel a rozšiřitelné chování System.ServiceModel.IExtensibleObject<T>.

Rozhraní IClientChannel však nedefinuje samotný kontrakt služby. Ty jsou deklarovány rozhraním kontraktů služeb (obvykle vygenerované z metadat služby pomocí nástroje ServiceModel Metadata Utility Tool (Svcutil.exe)). Typy klientů WCF rozšiřují jak IClientChannel, tak i rozhraní kontraktu cílové služby, což umožňuje aplikacím přímé volání operací a poskytuje přístup k funkcím za běhu na straně klienta. Vytvoření klienta WCF objektům WCFSystem.ServiceModel.ChannelFactory poskytuje informace potřebné k vytvoření běhového prostředí, které se může připojit a pracovat s nakonfigurovaným koncovým bodem služby.

Jak už bylo zmíněno dříve, musí být tyto dva typy klientů WCF nakonfigurované, než je budete moct použít. Nejjednodušší typy klientů WCF jsou objekty, které jsou odvozeny od ClientBase<TChannel> (nebo DuplexClientBase<TChannel>, pokud je kontrakt služby duplexní). Tyto typy můžete vytvořit pomocí konstruktoru, konfigurovaného programově nebo pomocí konfiguračního souboru a voláním přímo za účelem vyvolání operací služby. Základní přehled ClientBase<TChannel> objektů najdete v tématu Přehled klienta WCF.

Druhý typ se vygeneruje za běhu z volání CreateChannel metody. Aplikace, které se zabývají úzkou kontrolou specifik komunikace, obvykle používají tento typ klienta, označovaný jako objekt kanálu klienta, protože umožňuje větší přímou interakci než základní systém spuštění klienta a kanálu.

Továrny pro kanály

Třída, která je zodpovědná za vytvoření základní doby běhu, která podporuje vyvolání klienta, je System.ServiceModel.ChannelFactory<TChannel> třída. Klientské objekty WCF i objekty klientského kanálu WCF používají ChannelFactory<TChannel> objekt k vytváření instancí. ClientBase<TChannel> Odvozený klientský objekt zapouzdřuje zpracování objektu pro vytváření kanálů, ale pro řadu scénářů je naprosto rozumné použít objekt pro vytváření kanálů přímo. Běžným scénářem je, že chcete opakovaně vytvářet nové klientské kanály z existující továrny. Pokud používáte objekt klienta, můžete získat podkladovou továrnu kanálů z objektu klienta WCF voláním vlastnosti ClientBase<TChannel>.ChannelFactory.

Je důležité si uvědomit, že továrny kanálů vytvářejí nové instance klientských kanálů podle konfigurace poskytnuté jim před voláním ChannelFactory<TChannel>.CreateChannel. Jakmile zavoláte CreateChannel (nebo ClientBase<TChannel>.OpenClientBase<TChannel>.CreateChannel, nebo jakoukoli operaci s objektem klienta WCF), nemůžete upravit objekt pro vytváření kanálů a očekávat, že se kanály dostanou do různých instancí služby, i když pouze měníte cílovou adresu koncového bodu. Pokud chcete vytvořit objekt klienta nebo kanál klienta s jinou konfigurací, musíte nejprve vytvořit nový generátor kanálů.

Další informace o různých problémech s používáním klientských objektů WCF a klientských kanálů WCF naleznete v tématu Přístup ke službám pomocí klienta WCF.

Následující dvě části popisují vytvoření a použití objektů kanálu klienta WCF.

Vytvoření nového objektu klientského kanálu WCF

Pro ilustraci použití kanálu klienta předpokládejme, že se vygeneroval následující kontrakt služby.

[System.ServiceModel.ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
    [System.ServiceModel.OperationContractAttribute(
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
      ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
    )]
    [System.ServiceModel.FaultContractAttribute(
      typeof(microsoft.wcf.documentation.SampleFault),
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
    )]
    string SampleMethod(string msg);
}

Pokud se chcete připojit ke službě ISampleService , použijte vygenerované rozhraní kontraktu přímo s objektem pro vytváření kanálů (ChannelFactory<TChannel>). Jakmile vytvoříte a nakonfigurujete objekt pro vytváření kanálů pro konkrétní kontrakt, můžete volat metodu CreateChannel pro vrácení objektů kanálu klienta, které můžete použít ke komunikaci se službou ISampleService .

Při použití ChannelFactory<TChannel> třídy s rozhraním kontraktu služby je nutné přetypovat do IClientChannel rozhraní, aby bylo možné explicitně otevřít, zavřít nebo přerušit kanál. Pro snadnější práci nástroj Svcutil.exe také generuje pomocné rozhraní, které implementuje rozhraní služebního kontraktu a umožňuje vám interagovat s infrastrukturou kanálu klienta pomocí IClientChannel, bez nutnosti přetypování. Následující kód ukazuje definici pomocného klientského kanálu, který implementuje předchozí kontrakt služby.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

Vytvoření nového objektu klientského kanálu WCF

Pokud chcete pro připojení ISampleService ke službě použít klientský kanál, použijte vygenerované rozhraní kontraktu (nebo pomocnou verzi) přímo s objektem pro vytváření kanálů a jako parametr typu předejte typ rozhraní kontraktu. Po vytvoření a konfiguraci objektu pro vytváření kanálů pro konkrétní kontrakt můžete volat metodu ChannelFactory<TChannel>.CreateChannel pro vrácení objektů kanálu klienta, které můžete použít ke komunikaci se službou ISampleService .

Objekty klientského kanálu při vytváření implementují IClientChannel a rozhraní kontraktu. Můžete je proto použít přímo k volání operací, které pracují se službou, která podporuje daný kontrakt.

Rozdíl mezi používáním klientských objektů a objektů klientského kanálu je pouze jedním z řízení a snadného použití pro vývojáře. Mnoho vývojářů, kteří dobře pracují s třídami a objekty, budou preferovat použití objektu klienta WCF místo kanálu klienta WCF.

Příklad najdete v tématu Postupy: Použití ChannelFactory.