Импорт пользовательских метаданных для расширения WCF

В Windows Communication Foundation (WCF) импорт метаданных — это процесс создания абстрактного представления службы или ее компонентов из метаданных. Например, WCF может импортировать ServiceEndpoint экземпляры, Binding экземпляры или ContractDescription экземпляры из документа WSDL для службы. Чтобы импортировать метаданные службы в WCF, используйте реализацию абстрактного System.ServiceModel.Description.MetadataImporter класса. Типы, производные MetadataImporter от класса, реализуют поддержку импорта форматов метаданных, которые используют логику импорта WS-Policy в WCF.

Пользовательские метаданные состоят из элементов XML, которые не могут быть импортированы с помощью средств импорта метаданных, предоставляемых системой. Как правило, они включают пользовательские расширения WSDL и утверждения политики.

В этом разделе описано, как импортировать пользовательские расширения WSDL и утверждения политики. В нем не рассматривается сам процесс импорта. Дополнительные сведения об использовании типов, экспортируемых и импортируемых метаданных независимо от того, являются ли метаданные настраиваемыми или системными, см. в разделе "Экспорт и импорт метаданных".

Обзор

Тип System.ServiceModel.Description.WsdlImporter — это реализация абстрактного класса, включенного MetadataImporter в WCF. Тип WsdlImporter импортирует метаданные языка WSDL с прикрепленными политиками, объединенными в объекте System.ServiceModel.Description.MetadataSet. Утверждения политики и расширения WSDL, не распознаваемые стандартными средствами импорта метаданных, передаются для импорта зарегистрированным средствам импорта пользовательской политики и WSDL. Как правило, средства импорта реализуются с целью поддержки пользовательских элементов привязки или изменения импортированного контракта.

В данном разделе рассматриваются следующие вопросы.

  1. Реализация и использование интерфейса System.ServiceModel.Description.IWsdlImportExtension, который предоставляет данные WSDL пользовательским средствам импорта до создания описаний и создания кода. Этот интерфейс можно использовать для проверки или изменения типов описаний и компиляции кода с использованием заданного набора метаданных.

  2. Реализация и использование интерфейса System.ServiceModel.Description.IPolicyImportExtension, который предоставляет утверждения политики средствам импорта до создания объектов описания. Этот интерфейс можно использовать для проверки или изменения привязки или контракта на основании загруженных политик.

Дополнительные сведения об экспорте пользовательских утверждений WSDL и политик см. в разделе "Экспорт настраиваемых метаданных" для расширения WCF.

Импорт пользовательских расширений WSDL

Чтобы добавить поддержку импорта расширений WSDL, следует реализовать интерфейс IWsdlImportExtension, а затем добавить эту реализацию в свойство WsdlImportExtensions. Также WsdlImporter может загружать реализации интерфейса IWsdlImportExtension, зарегистрированного в файле конфигурации приложения. Обратите внимание, что регистрируется большое количество средств импорта WSDL, при этом имеет значение порядок зарегистрированных средств импорта WSDL.

Если объект WsdlImporter загружает и использует пользовательское средство импорта WSDL, сначала вызывается метод BeforeImport, чтобы разрешить изменение метаданных до начала процесса импорта. Затем выполняется импорт контрактов, после чего вызывается метод ImportContract, чтобы разрешить изменение контрактов, импортированных из метаданных. И, наконец, вызывается метод ImportEndpoint, чтобы разрешить изменение импортированных конечных точек.

Дополнительные сведения см. в разделе "Практическое руководство. Импорт пользовательского WSDL".

Импорт утверждений пользовательской политики

Тип WsdlImporter и средство служебной программы метаданных ServiceModel (Svcutil.exe) автоматически обрабатывают обработку различных типов утверждений политики в выражениях политик, подключенных к документам WSDL. Эти средства собирают, нормализуют и объединяют выражения политики, прикрепленные к привязкам WSDL и портам WSDL.

Чтобы добавить поддержку утверждений пользовательской политики, следует реализовать интерфейс IPolicyImportExtension, а затем добавить эту реализацию в свойство PolicyImportExtensions. Также MetadataImporter может загружать реализации интерфейса IPolicyImportExtension, зарегистрированного в файле конфигурации приложения. Обратите внимание, что регистрируется большое количество средств политик, при этом имеет значение порядок зарегистрированных средств импорта политик.

Система метаданных многократно вызывает метод IPolicyImportExtension.ImportPolicy для всех зарегистрированных расширений импорта политики для каждой комбинации альтернативной политики, прикрепленной к сообщению, операции и субъекта политики конечной точки. При импорте порта WSDL политики, прикрепленные к порту и соответствующей привязке WSDL, объединяются перед вызовом расширений импорта политики. Доступ к альтернативным политикам осуществляется с помощью PolicyConversionContext в виде объектов PolicyAssertionCollection. Каждый объект PolicyAssertionCollection является коллекцией утверждений политики, представленных объектами XmlElement.

Свойства Contract и BindingElements объекта PolicyConversionContext предоставляют объекты ContractDescription и BindingElement, импортированные из WSDL. Расширения импорта политики обрабатывают утверждения политики путем поиска экземпляров определенного типа утверждения политики, внесения соответствующих изменений в объекты ContractDescription или BindingElement и последующего удаления утверждений политики из соответствующего экземпляра PolicyAssertionCollection.

Атрибут wsp:Optional и вложенные выражения политики не нормализуются, поэтому обработка этих конструкций политики выполняется с помощью расширений импорта политики. Кроме того, возможен неоднократный вызов расширений импорта политики с одними и теми же объектами ContractDescription и BindingElement, поэтому расширения импорта политики должны быть надежными в такой ситуации.

Внимание

В средство импорта могут быть переданы недопустимые или неправильные метаданные. Убедитесь в том, что пользовательские средства импорта являются надежными для всех форм XML.

См. также