Расширение клиентов
В вызывающем приложении уровень модели службы отвечает за преобразование вызовов методов в коде приложения в исходящие сообщения, передачу их по соответствующим каналам, преобразование результатов обратно в возвращаемые значения и выходные параметры в коде приложения, а также за возврат результатов вызывающем объекту. Расширения модели службы изменяют или реализуют порядок и компоненты выполнения или взаимодействия, в том числе компоненты, включающие функции клиента или диспетчера, пользовательские расширения функциональности, перехват сообщений и параметров, а также другие расширяемые функции.
В этом разделе описано, как использовать классы ClientRuntime и ClientOperation в клиентском приложении Windows Communication Foundation (WCF), чтобы изменять поведение клиента WCF по умолчанию или перехватывать или изменять сообщения, параметры и возвращаемые значения до или после их отправки и получения через канал. Дополнительные сведения о расширении среды выполнения службы см. в разделе Расширение диспетчеров. Дополнительные сведения о расширениях функциональности, изменяющих и добавляющих пользовательские объекты в среду выполнения клиента, см. в разделе Настройка и расширение среды выполнения с помощью поведений.
Клиенты
На стороне клиента объект или канал клиента WCF преобразует вызовы метода в исходящие сообщения, а входящие сообщения — в результат выполнения операций, возвращаемый вызывающему приложению. (Дополнительные сведения о типах клиентов см. в разделе Клиентская архитектура.)
У типов клиентов WCF имеются типы среды выполнения, которые обрабатывают данные функции уровня конечных точек и операций. Когда приложение вызывает операцию, ClientOperation преобразует исходящие объекты в сообщение, обрабатывает перехватчики, проверяет, что исходящий вызов соответствует целевому контракту, и передает исходящее сообщение объекту ClientRuntime, который отвечает за создание исходящих каналов (и входящих в случае дуплексной связи) и управление ими, дополнительную обработку исходящих сообщений (например, изменение заголовка), обработку перехватчиков сообщений в обоих направлениях и перенаправление входящих дуплексных вызовов соответствующему объекту DispatchRuntime на стороне клиента. Объекты ClientOperation и ClientRuntime выполняют аналогичные функции, когда сообщения (в том числе ошибки) возвращаются клиенту.
Эти два класса среды выполнения являются основным расширением, позволяющим настроить обработку объектов и каналов клиентов WCF. Класс ClientRuntime позволяет пользователям перехватывать и расширять выполнение клиента на уровне всех сообщений в контракте. Класс ClientOperation позволяет пользователям перехватывать и расширять выполнение клиента для всех сообщений в заданной операции.
Изменение свойств и вставка дополнительных функций реализуются с помощью расширений функциональности контрактов, конечных точек и операций. Дополнительные сведения об использовании расширений функциональности этих типов для изменения функций клиента см. в разделе Настройка и расширение среды выполнения с помощью поведений.
Сценарии
Существует несколько причин для расширения клиентской системы, в том числе следующие.
Пользовательская проверка сообщений. У пользователя может возникнуть потребность проверить, что сообщение удовлетворяет конкретной схеме. Этого можно добиться, реализовав интерфейс IClientMessageInspector и присвоив реализацию свойству MessageInspectors. Примеры см. в разделах Как проверять или изменять сообщения на клиенте и Как проверять или изменять сообщения на клиенте.
Ведение пользовательского журнала сообщений. У пользователя может возникнуть потребность проверять и регистрировать некоторый набор сообщений приложения, которые проходят через конечную точку. Эту задачу можно решить с помощью интерфейсов перехватчиков сообщений.
Пользовательские преобразования сообщений. Вместо изменения кода приложений пользователю может потребоваться применить некоторые преобразования к сообщению в среде выполнения (например, для работы с версиями). Эту задачу можно также решить с помощью интерфейсов перехватчиков сообщений.
Пользовательская модель данных. Может возникнуть необходимость использовать модель данных и сериализации, отличную от модели, которая по умолчанию поддерживается в WCF (а именно объекты System.Runtime.Serialization.DataContractSerializer, System.Xml.Serialization.XmlSerializer и System.ServiceModel.Channels.Message). Этого можно добиться, реализовав интерфейсы модулей форматирования сообщений. Дополнительные сведения см. в описании интерфейса System.ServiceModel.Dispatcher.IClientMessageFormatter и свойства System.ServiceModel.Dispatcher.ClientOperation.Formatter.
Пользовательская проверка параметров. Может возникнуть необходимость принудительной проверки введенных параметров (в отличие от XML). Эту задачу можно решить с помощью интерфейсов инспекторов параметров. Пример см. в разделе Как проверять или изменять параметры или Проверка клиента.
Использование класса ClientRuntime
Класс ClientRuntime является точкой расширения, в которую можно добавить объекты расширения, перехватывающие сообщения и расширяющие функциональность клиента. Объекты перехвата могут обрабатывать все сообщения в определенном контракте, обрабатывать только сообщения для определенных операций, выполнять инициализацию пользовательского канала, а также реализовывать другие варианты функциональности пользовательского клиентского приложения.
Свойство CallbackDispatchRuntime возвращает объект времени выполнения диспетчеризации для клиентов обратного вызова, инициируемого службой.
Свойство OperationSelector принимает объект выбора пользовательской операции.
Свойство ChannelInitializers позволяет добавлять инициализатор канала, который может проверять или изменять клиентский канал.
Свойство Operations возвращает коллекцию объектов ClientOperation, в которую можно добавить пользовательские перехватчики сообщений, предоставляющие функциональность в соответствии с сообщениями данной операции.
Свойство ManualAddressing позволяет приложению отключать некоторые заголовки автоматической адресации для управления адресацией напрямую.
Свойство Via задает значение назначения сообщения на уровне транспорта для поддержки посредников и других сценариев.
Свойство MessageInspectors возвращает коллекцию объектов IClientMessageInspector, в которую можно добавить пользовательские перехватчики сообщений для всех сообщений, проходящих через клиент WCF.
Кроме того, существует несколько других свойств, которые извлекают данные о контракте:
Если клиент WCF является дуплексным клиентом WCF, то следующие свойства также извлекают сведения о клиенте WCF обратного вызова:
CallbackDispatchRuntime
Чтобы расширить выполнение клиента 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, см. разделе Как проверять или изменять параметры.
См. также
Задачи
Как проверять или изменять сообщения на клиенте
Как проверять или изменять параметры