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í, a to buď prostřednictvím System.ServiceModel.ChannelFactory nebo vytvořením instance ClientBase<TChannel> odvozené třídy, protože je generován nástrojem ServiceModel Metadata Utility Tool (Svcutil.exe). Tyto připravené třídy klienta zapouzdřují a delegují na implementaci klientského kanálu, která je dynamicky vytvořena pomocí ChannelFactory. Kanál klienta a továrna pro kanály, které je vygenerují, jsou proto ústředním bodem zájmu pro tuto diskuzi.

Klientské objekty a klientské kanály

Základní rozhraní klientů WCF je System.ServiceModel.IClientChannel rozhraní, které zpřístupňuje základní funkce klienta a základní komunikační objekt funkce System.ServiceModel.ICommunicationObject, kontextové System.ServiceModel.IContextChannelfunkce 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 generované z metadat služby pomocí nástroje, jako je ServiceModel Metadata Utility Tool (Svcutil.exe)). Typy klientů WCF rozšiřují IClientChannel rozhraní kontraktu cílové služby a umožňují aplikacím přímé volání operací a také přístup k funkcím za běhu na straně klienta. Vytvoření klienta WCF poskytuje objekty WCFSystem.ServiceModel.ChannelFactory s informacemi potřebnými k vytvoření doby běhu, 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 ( ClientBase<TChannel> nebo DuplexClientBase<TChannel> pokud je kontrakt služby duplexní kontrakt). 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.

Objekty pro vytváření kanálů

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 objekt pro vytváření podkladových kanálů z objektu klienta WCF voláním ClientBase<TChannel>.ChannelFactory vlastnosti.

Důležité si uvědomit o továrnách kanálů je, že vytvářejí nové instance klientských kanálů pro konfiguraci poskytnutou před voláním ChannelFactory<TChannel>.CreateChannel. Jakmile zavoláte CreateChannel (nebo ClientBase<TChannel>.CreateChannelClientBase<TChannel>.Open, 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 novou továrnu kanálu.

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í explicitně otevřít, zavřít nebo přerušit kanál. Aby se s ním snadněji pracovalo, nástroj Svcutil.exe také generuje pomocné rozhraní, které implementuje rozhraní kontraktů služeb a IClientChannel umožňuje interakci s infrastrukturou kanálu klienta, aniž by bylo nutné přetypovat. 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 .

Při vytváření se objekty klientského kanálu 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.