Расширение клиентов

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

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

Клиенты

На клиенте клиентский объект WCF или канал клиента преобразует вызовы метода в исходящие сообщения и входящие сообщения в результаты операции, возвращаемые вызывающей приложению. (Дополнительные сведения о типах клиентов см. в разделе Архитектура клиента WCF.)

Типы клиентов WCF имеют типы среды выполнения, обрабатывающие эту функциональность уровня конечной точки и операций. Когда приложение вызывает операцию, ClientOperation преобразует исходящие объекты в сообщение, обрабатывает перехватчики, проверяет, что исходящий вызов соответствует целевому контракту, и передает исходящее сообщение объекту ClientRuntime, который отвечает за создание исходящих каналов (и входящих в случае дуплексной связи) и управление ими, дополнительную обработку исходящих сообщений (например, изменение заголовка), обработку перехватчиков сообщений в обоих направлениях и перенаправление входящих дуплексных вызовов соответствующему объекту DispatchRuntime на стороне клиента. Объекты ClientOperation и ClientRuntime выполняют аналогичные функции, когда сообщения (в том числе ошибки) возвращаются клиенту.

Эти два класса среды выполнения являются основным расширением для настройки обработки клиентских объектов и каналов WCF. Класс ClientRuntime позволяет пользователям перехватывать и расширять выполнение клиента на уровне всех сообщений в контракте. Класс ClientOperation позволяет пользователям перехватывать и расширять выполнение клиента для всех сообщений в заданной операции.

Изменение свойств и вставка дополнительных функций реализуются с помощью расширений функциональности контрактов, конечных точек и операций. Дополнительные сведения об использовании этих типов поведения для выполнения настроек среды выполнения клиента см. в разделе "Настройка и расширение среды выполнения с помощью поведения".

Сценарии

Существует несколько причин для расширения клиентской системы, в том числе следующие.

Использование класса ClientRuntime

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

  • Свойство CallbackDispatchRuntime возвращает объект времени выполнения диспетчеризации для клиентов обратного вызова, инициируемого службой.

  • Свойство OperationSelector принимает объект выбора пользовательской операции.

  • Свойство ChannelInitializers позволяет добавлять инициализатор канала, который может проверять или изменять клиентский канал.

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

  • Свойство ManualAddressing позволяет приложению отключать некоторые заголовки автоматической адресации для управления адресацией напрямую.

  • Свойство Via задает значение назначения сообщения на уровне транспорта для поддержки посредников и других сценариев.

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

Кроме того, существует несколько других свойств, которые извлекают данные о контракте:

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

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

Объекты пользовательских расширений можно вставлять в коллекцию с помощью расширения функциональности оператора (объекта, реализующего интерфейс IOperationBehavior), контракта (объекта, реализующего интерфейс IContractBehavior) или конечной точки (объекта, реализующего интерфейс IEndpointBehavior). Устанавливаемый объект расширения функциональности добавляется в соответствующую коллекцию либо программным образам, либо декларативно (путем реализации пользовательского атрибута), либо путем реализации пользовательского объекта BehaviorExtensionElement, чтобы сделать возможной вставку расширения функциональности при помощи файла конфигурации приложения. Дополнительные сведения см. в разделе "Настройка и расширение среды выполнения с помощью поведения".

Примеры, демонстрирующие перехват в клиенте WCF, см. в статье "Практическое руководство. Проверка или изменение сообщений на клиенте".

Использование класса ClientOperation

Класс ClientOperation - это расположение для изменений клиента, вносимых во время выполнения, и точка вставки для пользовательских расширений, применяемых только к одной операции службы. (Чтобы изменить поведение клиента во время выполнения для всех сообщений в контракте, используйте класс ClientRuntime.)

Используйте свойство Operations, чтобы найти объект ClientOperation, который представляет определенную операцию службы. Следующие свойства позволяют вставлять пользовательские объекты в клиентскую систему WCF:

  • Используйте свойство Formatter для вставки пользовательской реализации IClientMessageFormatter для операции или изменения текущего модуля форматирования.

  • Используйте свойство ParameterInspectors для вставки пользовательской реализации IParameterInspector или для изменения текущей реализации.

Следующие свойства позволяют изменить систему при взаимодействии с модулем форматирования и пользовательскими инспекторами параметров.

  • Используйте свойство SerializeRequest, чтобы управлять сериализацией исходящего сообщения.

  • Используйте свойство DeserializeReply, чтобы управлять десериализацией входящего сообщения.

  • Используйте свойство Action, чтобы управлять действием WS-Addressing сообщения запроса.

  • BeginMethod Используйте и EndMethod укажите, какие клиентские методы WCF связаны с асинхронной операцией.

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

  • Используйте свойства IsInitiating и IsTerminating, чтобы задать соответственно инициализацию или завершение сеанса при вызове операции.

  • Используйте свойство IsOneWay, чтобы определить, является ли операция односторонней.

  • Используйте свойство Parent для получения родительского объекта ClientRuntime.

  • Используйте свойство Name для получения имени операции.

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

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

Обычно реализации расширения функциональности операции (объекта, реализующего интерфейс IOperationBehavior) бывает достаточно, но для достижения такого же результата можно также воспользоваться расширениями функциональности конечных точек и контрактов, найдя объект OperationDescription для конкретной операции и прикрепив к нему расширение функциональности. Дополнительные сведения см. в разделе "Настройка и расширение среды выполнения с помощью поведения".

Чтобы использовать пользовательское расширение функциональности на этапе конфигурации, установите его с использованием обработчика раздела конфигурации пользовательского расширения функциональности. Его также можно установить путем создания пользовательского атрибута.

Примеры, демонстрирующие перехват в клиенте WCF, см. в статье "Практическое руководство. Проверка или изменение параметров".

См. также