Поделиться через


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

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

Общие сведения

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

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

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

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

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

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

Базовым интерфейсом клиентов WCF является интерфейс System.ServiceModel.IClientChannel, представляющий основные клиентские функции, а также базовые функции коммуникационных объектов System.ServiceModel.ICommunicationObject, контекстные функции канала System.ServiceModel.IContextChannel и расширяемое поведение объекта System.ServiceModel.IExtensibleObject.

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

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

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

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

За создание базовой среды выполнения, которая поддерживает вызовы клиентов, отвечает класс System.ServiceModel.ChannelFactory. Клиентские объекты WCF и объекты клиентских каналов WCF используют объект ChannelFactory для создания экземпляров; клиентский объект, унаследованный от ClientBase, инкапсулирует обработку фабрики каналов, но в ряде сценариев полностью подходит для использования фабрики каналов непосредственно. Распространенный сценарий для этого — необходимость многократного создания новых клиентских каналов из существующей фабрики. В случае использования клиентского объекта можно получить базовую фабрику каналов из клиентского объекта WCF, вызвав свойство System.ServiceModel.ClientBase.ChannelFactory.

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

Дополнительные сведения различных проблемах, связанных с использованием клиентских объектов WCF и клиентских каналов WCF, см. в разделе Обращение к службам с использованием клиента.

В следующих двух разделах описываются создание и использование объектов клиентских каналов 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). При создании и настройке фабрики каналов для конкретного контракта можно вызвать метод CreateChannel для возврата объектов клиентских каналов, которые можно использовать для взаимодействия со службой ISampleService.

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

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

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

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

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

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

Пример см. в разделе Как использовать ChannelFactory.