Architektura klienta

Aplikacje używają obiektów klienta programu Windows Communication Foundation (WCF) do wywoływania operacji usługi. W tym temacie omówiono obiekty klienta programu WCF, kanały klienta programu WCF i ich relacje z podstawową architekturą kanału. Aby zapoznać się z podstawowym omówieniem obiektów klienta WCF, zobacz Omówienie klienta WCF. Aby uzyskać więcej informacji na temat warstwy kanału, zobacz Rozszerzanie warstwy kanału.

Omówienie

Czas wykonywania modelu usługi tworzy klientów WCF, które składają się z następujących elementów:

  • Automatycznie wygenerowana implementacja klienta kontraktu usługi, która zamienia wywołania z kodu aplikacji na komunikaty wychodzące i zamienia komunikaty odpowiedzi na parametry wyjściowe i zwraca wartości, które aplikacja może pobrać.

  • Implementacja interfejsu sterowania (System.ServiceModel.IClientChannel), który grupuje różne interfejsy i zapewnia dostęp do funkcji kontroli, zwłaszcza możliwość zamknięcia sesji klienta i usunięcia kanału.

  • Kanał klienta utworzony na podstawie ustawień konfiguracji określonych przez używane powiązanie.

Aplikacje mogą tworzyć takich klientów na żądanie za pośrednictwem System.ServiceModel.ChannelFactory klasy pochodnej ClientBase<TChannel> lub przez utworzenie wystąpienia klasy pochodnej, ponieważ jest generowane przez narzędzie ServiceModel Metadata Tool (Svcutil.exe). Te gotowe klasy klientów hermetyzują i delegują do implementacji kanału klienta, która jest dynamicznie konstruowana przez element ChannelFactory. W związku z tym kanał klienta i fabryka kanałów, które je produkują, są centralnym punktem orientacyjnym dla tej dyskusji.

Obiekty klienta i kanały klienta

Podstawowym interfejsem klientów WCF jest System.ServiceModel.IClientChannel interfejs, który uwidacznia podstawowe funkcje klienta, a także podstawowe funkcje obiektu komunikacyjnego System.ServiceModel.ICommunicationObjectprogramu , funkcje System.ServiceModel.IContextChannelkontekstowe System.ServiceModel.IExtensibleObject<T>programu i rozszerzalne zachowanie programu .

Interfejs IClientChannel nie definiuje jednak samego kontraktu usługi. Są one deklarowane przez interfejs kontraktu usługi (zazwyczaj generowane na podstawie metadanych usługi przy użyciu narzędzia serviceModel Metadata Tool (Svcutil.exe)). Typy klientów programu WCF rozszerzają zarówno IClientChannel interfejs kontraktu usługi docelowej, jak i umożliwiają aplikacjom bezpośrednie wywoływanie operacji, a także mają dostęp do funkcji czasu wykonywania po stronie klienta. Tworzenie klienta programu WCF udostępnia obiekty WCFSystem.ServiceModel.ChannelFactory z informacjami niezbędnymi do utworzenia czasu wykonywania, który może łączyć się ze skonfigurowanym punktem końcowym usługi i wchodzić z nim w interakcje.

Jak wspomniano wcześniej, przed ich użyciem należy skonfigurować dwa typy klientów programu WCF. Najprostsze typy klientów WCF to obiekty pochodzące z ClientBase<TChannel> (lub DuplexClientBase<TChannel> jeśli kontrakt usługi jest kontraktem dwudupleksowym). Można utworzyć te typy przy użyciu konstruktora, skonfigurowanego programowo lub przy użyciu pliku konfiguracji, a następnie wywołać je bezpośrednio w celu wywołania operacji usługi. Aby zapoznać się z podstawowym omówieniem ClientBase<TChannel> obiektów, zobacz Omówienie klienta WCF.

Drugi typ jest generowany w czasie wykonywania z wywołania metody CreateChannel . Aplikacje związane z ścisłą kontrolą specyfiki komunikacji zwykle używają tego typu klienta, nazywanego obiektem kanału klienta, ponieważ umożliwia bardziej bezpośrednią interakcję niż bazowy system uruchamiania i kanału klienta.

Fabryki kanałów

Klasa, która jest odpowiedzialna za tworzenie bazowego czasu wykonywania, który obsługuje wywołania klientów, jest klasą System.ServiceModel.ChannelFactory<TChannel> . Zarówno obiekty klienta programu WCF, jak i obiekty kanału klienta WCF używają ChannelFactory<TChannel> obiektu do tworzenia wystąpień; ClientBase<TChannel> pochodny obiekt klienta hermetyzuje obsługę fabryki kanałów, ale w wielu scenariuszach jest całkowicie uzasadnione bezpośrednie użycie fabryki kanałów. Typowym scenariuszem jest to, że chcesz wielokrotnie tworzyć nowe kanały klienckie z istniejącej fabryki. Jeśli używasz obiektu klienta, możesz uzyskać podstawową fabrykę kanałów z obiektu klienta WCF, wywołując ClientBase<TChannel>.ChannelFactory właściwość .

Ważne jest, aby pamiętać o fabrykach kanałów, że tworzą nowe wystąpienia kanałów klienckich dla konfiguracji dostarczonej do nich przed wywołaniem metody ChannelFactory<TChannel>.CreateChannel. Po wywołaniu CreateChannel operacji (lub ClientBase<TChannel>.CreateChannelClientBase<TChannel>.Open, lub dowolnej operacji w obiekcie klienta WCF) nie można zmodyfikować fabryki kanałów i oczekiwać, że kanały do różnych wystąpień usługi, nawet jeśli tylko zmieniasz docelowy adres punktu końcowego. Jeśli chcesz utworzyć obiekt klienta lub kanał klienta z inną konfiguracją, musisz najpierw utworzyć nową fabrykę kanałów.

Aby uzyskać więcej informacji na temat różnych problemów z używaniem obiektów klienta programu WCF i kanałów klienta programu WCF, zobacz Accessing Services Using a WCF Client (Uzyskiwanie dostępu do usług przy użyciu klienta WCF).

W poniższych dwóch sekcjach opisano tworzenie i używanie obiektów kanału klienta WCF.

Tworzenie nowego obiektu kanału klienta WCF

Aby zilustrować użycie kanału klienta, załóżmy, że został wygenerowany następujący kontrakt usługi.

[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);
}

Aby nawiązać połączenie z usługą ISampleService , użyj wygenerowanego interfejsu kontraktu bezpośrednio z fabryką kanałów (ChannelFactory<TChannel>). Po utworzeniu i skonfigurowaniu fabryki kanałów dla określonego kontraktu można wywołać CreateChannel metodę w celu zwrócenia obiektów kanału klienta, których można użyć do komunikowania się z usługą ISampleService .

W przypadku korzystania z ChannelFactory<TChannel> klasy z interfejsem kontraktu usługi należy rzutować go do interfejsu IClientChannel , aby jawnie otworzyć, zamknąć lub przerwać kanał. Aby ułatwić pracę, narzędzie Svcutil.exe generuje również interfejs pomocnika, który implementuje zarówno interfejs kontraktu usługi, jak i IClientChannel umożliwia interakcję z infrastrukturą kanału klienta bez konieczności rzutowania. Poniższy kod przedstawia definicję kanału klienta pomocnika, który implementuje poprzedni kontrakt usługi.

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

Tworzenie nowego obiektu kanału klienta WCF

Aby użyć kanału klienta do nawiązania połączenia z usługą ISampleService , użyj wygenerowanego interfejsu kontraktowego (lub wersji pomocniczej) bezpośrednio z fabryką kanałów, przekazując typ interfejsu kontraktu jako parametr typu. Po utworzeniu i skonfigurowaniu fabryki kanałów dla określonego kontraktu można wywołać ChannelFactory<TChannel>.CreateChannel metodę w celu zwrócenia obiektów kanału klienta, których można użyć do komunikowania się z usługą ISampleService .

Po utworzeniu obiekty kanału klienta implementują IClientChannel i interfejs kontraktu. W związku z tym można ich używać bezpośrednio do wywoływania operacji, które współdziałają z usługą, która obsługuje ten kontrakt.

Różnica między używaniem obiektów klienta i obiektów kanału klienta jest tylko jedną z kontroli i łatwości użycia dla deweloperów. Wielu deweloperów, którzy dobrze pracują z klasami i obiektami, wolą używać obiektu klienta WCF zamiast kanału klienta WCF.

Przykład można znaleźć w temacie How to: Use the ChannelFactory (Instrukcje: korzystanie z metody ChannelFactory).