Клиентская архитектура

Приложения используют клиентские объекты 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>.CreateChannelClientBase<TChannel>.Openлюбой операции в клиентском объекте 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".