Архитектура клиента

Приложения используют клиентские объекты Windows Communication Foundation (WCF) для вызова операций службы. В этом разделе рассматриваются клиентские объекты WCF, каналы клиента WCF и их связи с базовой архитектурой каналов. Общие сведения о клиентских объектах WCF см. в обзоре клиента WCF. Дополнительные сведения о слое канала см. в разделе "Расширение уровня канала".

Обзор

Среда выполнения модели службы создает клиенты WCF, которые состоят из следующих элементов:

  • Автоматическая реализация клиентского контракта службы, которая преобразует вызовы из кода приложения в исходящие сообщения и преобразует ответные сообщения в выходные параметры и возвращает значения, которые может получить приложение.

  • Реализация интерфейса управления (System.ServiceModel.IClientChannel), которая объединяет различные интерфейсы и предоставляет доступ к функциям управления, в частности возможность закрытия сеанса клиента и удаления канала.

  • Клиентский канал, созданный на основе параметров конфигурации, указанных используемой привязкой.

Приложения могут создавать такие клиенты по требованию либо путем System.ServiceModel.ChannelFactory создания экземпляра производного класса, так как он создается ClientBase<TChannel> ServiceModel (Svcutil.exe). Эти готовые классы клиентов инкапсулируют и делегируют реализацию клиентского канала, которая динамически создается с помощью ChannelFactory. Таким образом, клиентский канал и фабрика каналов, которые производят их, являются основной точкой интереса для этого обсуждения.

Клиентские объекты и клиентские каналы

Базовый интерфейс клиентов WCF — это System.ServiceModel.IClientChannel интерфейс, который предоставляет основные функции клиента, а также основные функции System.ServiceModel.ICommunicationObjectSystem.ServiceModel.IContextChannelобъекта коммуникации, функции контекста и расширяемое поведениеSystem.ServiceModel.IExtensibleObject<T>.

Однако IClientChannel интерфейс не определяет сам контракт службы. Они объявляются интерфейсом контракта службы (обычно создаются из метаданных службы с помощью такого средства, как Средство работы с метаданными ServiceModel (Svcutil.exe)). Типы клиентов WCF расширяют как IClientChannel, так и целевой интерфейс контракта службы, чтобы приложения могли напрямую вызывать операции и иметь доступ к функциональности среды выполнения на стороне клиента. Создание клиента WCF предоставляет объекты WCFSystem.ServiceModel.ChannelFactory с информацией, необходимой для создания среды выполнения, которая может подключаться к настроенной конечной точке службы и взаимодействовать с ней.

Как упоминалось ранее, перед их использованием необходимо настроить два типа клиентов WCF. Простейшие типы клиентов WCF — это объекты, производные от ClientBase<TChannel> (или DuplexClientBase<TChannel> если контракт службы является дуплексным контрактом). Эти типы можно создать с помощью конструктора, настроенного программным способом или с помощью файла конфигурации, а затем вызвать непосредственно для вызова операций службы. Общие сведения об объектах ClientBase<TChannel> см. в обзоре клиента WCF.

Второй тип создается во время выполнения из вызова метода CreateChannel. Приложения, которые связаны с точным контролем особенностей коммуникации, обычно используют этот тип клиента, называемый объектом клиентского канала, поскольку он обеспечивает более прямое взаимодействие, чем базовая среда выполнения клиента и система каналов.

Фабрики каналов

Класс, отвечающий за создание базовой среды выполнения, поддерживающей вызовы клиентов, является классом System.ServiceModel.ChannelFactory<TChannel> . Как клиентские объекты WCF, так и объекты клиентского канала WCF используют объект ChannelFactory<TChannel> для создания экземпляров. Объект производного клиента ClientBase<TChannel> инкапсулирует обработку фабрики каналов, однако в ряде сценариев вполне разумно использовать фабрику каналов непосредственно. Распространенный сценарий заключается в том, чтобы многократно создавать новые клиентские каналы из существующей фабрики. При использовании клиентского объекта можно получить базовую фабрику каналов из клиентского объекта WCF, используя свойство ClientBase<TChannel>.ChannelFactory.

Важно запомнить, что фабрики каналов создают новые экземпляры клиентских каналов на основе конфигурации, предоставленной им перед вызовом ChannelFactory<TChannel>.CreateChannel. После вызова CreateChannel (или ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel или любой другой операции в клиентском объекте WCF), вы не сможете изменить фабрику каналов и ожидать получения каналов к разным экземплярам служб, даже если вы просто изменяете целевой адрес конечной точки. Если вы хотите создать клиентский объект или канал клиента с другой конфигурацией, сначала необходимо создать фабрику каналов.

Дополнительные сведения о различных проблемах с использованием клиентских объектов WCF и каналов клиента WCF см. в разделе Accessing Services Using a WCF Client.

В следующих двух разделах описывается создание и использование объектов клиентского канала WCF.

Создание объекта клиентского канала WCF

Чтобы проиллюстрировать использование клиентского канала, предположим, что был создан следующий контракт службы.

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

Чтобы подключиться к ISampleService службе, используйте созданный интерфейс контракта непосредственно с фабрикой каналов (ChannelFactory<TChannel>). После того как вы создадите и настроите фабрику каналов для определенного контракта, вы можете вызвать метод CreateChannel, чтобы вернуть объекты клиентского канала, которые можно использовать для взаимодействия со службой ISampleService.

При использовании класса ChannelFactory<TChannel> с интерфейсом контракта службы необходимо явно привести к интерфейсу IClientChannel для открытия, закрытия или прекращения работы канала. Чтобы упростить работу, средство Svcutil.exe также создает вспомогательный интерфейс, реализующий интерфейс контракта службы и IClientChannel позволяющий взаимодействовать с инфраструктурой клиентского канала без необходимости приведения. В следующем коде показано определение вспомогательного клиентского канала, реализующего предыдущий контракт службы.

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

Создание объекта клиентского канала WCF

Чтобы использовать клиентский канал для подключения к ISampleService службе, используйте созданный интерфейс контракта (или его вспомогательную версию) непосредственно с фабрикой каналов, передав тип интерфейса контракта в качестве параметра типа. После того как фабрика каналов для определенного контракта создана и настроена, можно вызвать метод ChannelFactory<TChannel>.CreateChannel, чтобы вернуть объекты клиентского канала, которые можно использовать для взаимодействия со службой ISampleService.

При создании объекты клиентского канала реализуют IClientChannel и интерфейс контракта. Поэтому их можно использовать непосредственно для вызова операций, взаимодействующих с службой, поддерживающей этот контракт.

Разница между использованием клиентских объектов и объектов канала клиента является лишь одним из элементов управления и простоты использования для разработчиков. Многие разработчики, которые комфортно работают с классами и объектами, предпочитают использовать клиентский объект WCF вместо клиентского канала WCF.

Пример см. в разделе "Практическое руководство. Использование ChannelFactory".