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

Приложения используют клиентские объекты 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.ICommunicationObject контекста System.ServiceModel.IContextChannel и расширяемое поведение System.ServiceModel.IExtensibleObject<T> .

Интерфейс IClientChannel, однако, не определяет сам контракт службы. Они объявляются интерфейсом контракта службы (обычно создаются из метаданных службы с помощью такого средства, как средство служебной программы метаданных ServiceModel (Svcutil.exe)). Типы клиентов WCF расширяют IClientChannel и, и целевой интерфейс контракта службы, чтобы позволить приложениям напрямую вызывать операции, а также иметь доступ к функциональным возможностям во время выполнения на стороне клиента. Создание клиента WCF предоставляет объекты WCF System.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, см. в разделе доступ к службам с помощью клиента 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<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.