Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
Przegląd
Środowisko uruchomieniowe 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ą kreować takich klientów na życzenie, albo poprzez System.ServiceModel.ChannelFactory albo poprzez utworzenie instancji klasy pochodnej ClientBase<TChannel>, gdy jest ona generowana przez narzędzie ServiceModel Metadata Utility Tool (Svcutil.exe). Te gotowe do użycia klasy klienta 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óra je produkuje, są głównym punktem zainteresowania 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 (zwykle generowane na podstawie metadanych usługi przy użyciu narzędzia serviceModel Metadata Tool (Svcutil.exe)). Typy klientów WCF rozszerzają zarówno IClientChannel, jak i interfejs kontraktu usługi docelowej, aby umożliwić aplikacjom bezpośrednie wywoływanie operacji oraz dostęp do funkcji środowiska uruchomieniowego po stronie klienta. Tworzenie klienta programu WCF udostępnia obiekty WCFSystem.ServiceModel.ChannelFactory z informacjami niezbędnymi do utworzenia środowiska uruchomieniowego, które może łączyć się ze skonfigurowanym punktem końcowym usługi i korzystać z niego.
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 podczas działania 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ż bazowe środowisko uruchomieniowe klienta i system kanału.
Fabryki kanałów
Klasa odpowiedzialna za tworzenie bazowego środowiska uruchomieniowego obsługującego wywołania klienta jest klasą System.ServiceModel.ChannelFactory<TChannel> . Zarówno obiekty klienta WCF, jak i obiekty kanału klienta WCF używają obiektu ChannelFactory<TChannel> do tworzenia wystąpień; ClientBase<TChannel> obiekt klienta pochodny hermetyzuje zarządzanie fabryką kanałów, ale w wielu scenariuszach jest w pełni 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, aby pamiętać, że fabryki kanałów tworzą nowe wystąpienia kanałów klienckich na podstawie dostarczonej konfiguracji przed wywołaniem ChannelFactory<TChannel>.CreateChannel. Po wywołaniu CreateChannel (lub ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel albo jakiejkolwiek operacji na obiekcie klienta WCF), nie można zmodyfikować fabryki kanałów i oczekiwać uzyskania kanałów 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ć metodę CreateChannel, aby uzyskać obiekty kanału klienta, które można użyć do komunikowania się z usługą ISampleService.
Podczas korzystania z klasy ChannelFactory<TChannel> z interfejsem kontraktu serwisowego, należy dokonać rzutowania na interfejs IClientChannel, aby wyraźnie 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 połączeń dla określonego kontraktu, można wywołać metodę ChannelFactory<TChannel>.CreateChannel, aby odebrać obiekty kanału klienta, z których można korzystać 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 a obiektów kanału klienta sprowadza się jedynie do kwestii kontroli i łatwości obsługi 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 Instrukcje: korzystanie z metody ChannelFactory.