Общие сведения об архитектуре метаданных
Платформа Windows Communication Foundation (WCF) обеспечивает широкие возможности для экспорта, публикации, извлечения и импорта метаданных служб. В службах WCF метаданные используются для описания порядка взаимодействия с конечными точками службы, чтобы средства, такие как Svcutil.exe, могли автоматически создавать клиентский код для доступа к службе.
Большая часть типов, составляющих инфраструктуру метаданных WCF, принадлежит к пространству имен System.ServiceModel.Description.
Платформа WCF использует класс ServiceEndpoint для описания конечных точек службы. С помощью WCF можно создавать метаданные для конечных точек служб или импортировать метаданные служб, чтобы создавать экземпляры ServiceEndpoint.
В WCF метаданные службы представляются в форме экземпляра типа MetadataSet, структура которого строго соответствует формату сериализации метаданных, определенному в спецификации WS-MetadataExchange. Тип MetadataSet объединяет фактические метаданные службы, например документы на языке WSDL, документы схемы XML или выражения WS-Policy, в коллекцию экземпляров MetadataSection. Каждый экземпляр System.ServiceModel.Description.MetadataSection содержит собственный идентификатор и диалект метаданных. Свойство System.ServiceModel.Description.MetadataSection.Metadata объекта System.ServiceModel.Description.MetadataSection может содержать следующие элементы.
Необработанные метаданные.
Экземпляр MetadataReference.
Экземпляр MetadataLocation.
Экземпляры System.ServiceModel.Description.MetadataReference указывают на другую конечную точку обмена метаданными (MEX), а экземпляры System.ServiceModel.Description.MetadataLocation указывают на документ метаданных, используя для этого URL-адрес HTTP. Платформа WCF поддерживает описание реализуемых службой конечных точек службы, контрактов службы, привязок, шаблонов обмена сообщениями, сообщений и сообщений о сбоях с помощью документов WSDL. Используемые службой типы данных описываются в документах WSDL с помощью схемы XML. Дополнительные сведения см. в разделе Импорт и экспорт схемы. С помощью WCF можно экспортировать и импортировать расширения WSDL для поведения службы, поведений контракта и элементов привязки, расширяющих функциональные возможности службы. Дополнительные сведения см. в разделе Экспорт пользовательских метаданных для расширения WCF.
Экспорт метаданных службы
В среде WCF экспорт метаданных представляет собой процесс описания конечных точек службы и проецирования их в параллельное, стандартизованное представление, позволяющее клиентам понять, как использовать службу. Для экспорта метаданных из экземпляров ServiceEndpoint используется реализация абстрактного класса MetadataExporter. Реализация System.ServiceModel.Description.MetadataExporter создает метаданные, которые инкапсулируются в экземпляр MetadataSet.
Класс System.ServiceModel.Description.MetadataExporter предоставляет платформу для создания выражений политики, которые описывают возможности и требования привязки конечной точки, а также связанные с ней операции, сообщения и ошибки. Эти выражения политики попадают в экземпляр PolicyConversionContext. Реализация System.ServiceModel.Description.MetadataExporter может затем прикрепить эти выражения политики к создаваемым ею метаданным.
System.ServiceModel.Description.MetadataExporter делает вызовы в каждый элемент System.ServiceModel.Channels.BindingElement, который реализует интерфейс IPolicyExportExtension в привязке для ServiceEndpoint, при создании объекта PolicyConversionContext для используемой реализации System.ServiceModel.Description.MetadataExporter. Можно экспортировать утверждения новой политики, реализовав интерфейс IPolicyExportExtension в пользовательских реализациях типа BindingElement.
Тип WsdlExporter является реализацией абстрактного класса System.ServiceModel.Description.MetadataExporter, входящего в WCF. Тип WsdlExporter создает метаданные WSDL с прикрепленными выражениями политики.
Чтобы экспортировать пользовательские метаданные языка WSDL или расширения языка WSDL для поведений конечной точки, поведений контракта или элементов привязки конечной точки службы, можно реализовать интерфейс IWsdlExportExtension. При создании документа WSDL объект WsdlExporter ищет в экземпляре ServiceEndpoint элементы привязки, поведения операций, поведения контрактов и поведения конечных точек, которые реализуют интерфейс IWsdlExportExtension.
Публикация метаданных службы
Службы WCF публикуют метаданные путем публикации одной или нескольких конечных точек метаданных. Публикация метаданных службы делает метаданные службы доступными через стандартизованные протоколы, например MEX и запросы HTTP/GET. Конечные точки метаданных похожи на другие конечные точки служб в том смысле, что у них есть адрес, привязка и контракт. Конечные точки метаданных можно добавлять к узлу службы с помощью файла конфигурации или кода.
Для публикации конечных точек метаданных для службы WCF сначала необходимо добавить в службу экземпляр поведения службы ServiceMetadataBehavior. Добавление в службу экземпляра System.ServiceModel.Description.ServiceMetadataBehavior расширяет службу, позволяя ей публиковать метаданные через одну или несколько конечных точек метаданных. После добавления поведения службы System.ServiceModel.Description.ServiceMetadataBehavior можно публиковать конечные точки метаданных, поддерживающие протокол MEX, или конечные точки метаданных, отвечающие на запросы HTTP/GET.
Чтобы добавить конечные точки метаданных, использующие протокол MEX, следует добавить в узел службы конечные точки службы, которые используют контракт службы с именем IMetadataExchange. В WCF определен интерфейс IMetadataExchange, имеющий это имя контракта службы. Конечные точки WS-Metadata Exchange (или конечные точки MEX) могут использовать одну из четырех привязок по умолчанию, предоставляемых статическими методами производства в классе MetadataExchangeBindings для сопоставления с привязками по умолчанию, используемыми средствами WCF, например Svcutil.exe. Настраивать конечные точки метаданных MEX также можно с помощью пользовательской привязки.
Поведение ServiceMetadataBehavior использует System.ServiceModel.Description.WsdlExporter для экспорта метаданных для всех конечных точек службы. Дополнительные сведения экспорте метаданных из службы см. в разделе Экспорт и импорт метаданных.
Класс ServiceMetadataBehavior расширяет узел службы, добавляя экземпляр ServiceMetadataExtension в качестве расширения узла службы. Расширение System.ServiceModel.Description.ServiceMetadataExtension обеспечивает реализацию протоколов публикации метаданных. Расширение System.ServiceModel.Description.ServiceMetadataExtension также можно использовать для получения метаданных службы во время выполнения, обратившись к свойству Metadata.
Внимание! |
---|
Если добавить конечную точку MEX в файл конфигурации приложения, а затем добавить ServiceMetadataBehavior в узел службы в коде, будет вызвано следующее исключение. System.InvalidOperationException: не удалось найти имя контракта IMetadataExchange в списке контрактов, реализованных в службе Service1. Добавьте ServiceMetadataBehavior в файл конфигурации или непосредственно в ServiceHost, чтобы обеспечить поддержку этого контракта. В качестве решения этой проблемы можно добавить ServiceMetadataBehavior в файл конфигурации или добавить в код конечную точку и ServiceMetadataBehavior. Пример добавления ServiceMetadataBehavior в файл конфигурации приложения см. в разделе Образец для начала работы. Пример добавления ServiceMetadataBehavior в код см. в образце Резидентное размещение. |
Внимание! |
---|
Если опубликовать метаданные для службы, которая представляет доступ к двум различным контрактам службы, которые содержат операции с одинаковыми именами, вызывается исключение. Например, если служба предоставляет доступ к контракту службы с именем ICarService, который содержит операцию Get(Car c), и эта же служба предоставляет доступ к контракту службы с именем IBookService, который содержит операцию Get(Book b), то при создании метаданных службы вызывается исключение или выводится сообщение об ошибке. Чтобы устранить эту проблему, выполните одно из следующих действий. |
Извлечение метаданных службы
Среда WCF позволяет извлекать метаданные служб с помощью стандартизованных протоколов, например WS-MetadataExchange и HTTP. Оба эти протокола поддерживаются типом MetadataExchangeClient. Чтобы извлечь метаданные службы с помощью типа System.ServiceModel.Description.MetadataExchangeClient, необходимо указать адрес и необязательную привязку. В роли привязки, используемой экземпляром System.ServiceModel.Description.MetadataExchangeClient, может выступать одна из привязок по умолчанию статического класса MetadataExchangeBindings, предоставляемая пользователем привязка или привязка, загруженная из конфигурации конечной точки для контракта IMetadataExchange. Кроме того, тип System.ServiceModel.Description.MetadataExchangeClient может выполнять разрешение URL-адресов ссылок HTTP на метаданные с помощью типа HttpWebRequest.
По умолчанию экземпляр System.ServiceModel.Description.MetadataExchangeClient связан с одним экземпляром ChannelFactoryBase. Можно изменить или заменить экземпляр ChannelFactoryBase, используемый экземпляром System.ServiceModel.Description.MetadataExchangeClient, переопределив виртуальный метод GetChannelFactory. Аналогично можно изменить или заменить экземпляр System.Net.HttpWebRequest, используемый экземпляром System.ServiceModel.Description.MetadataExchangeClient для создания запросов HTTP/GET, переопределив виртуальный метод System.ServiceModel.Description.MetadataExchangeClient.GetWebRequest(System.Uri,System.String,System.String).
Метаданные службы можно извлечь с помощью протокола WS-MetadataExchange и запросов HTTP/GET, воспользовавшись для этого средством Svcutil.exe и передав ему параметр /target:metadata и адрес. Средство Svcutil.exe загружает метаданные, расположенные по указанному адресу, и сохраняет файлы на диске. Средство Svcutil.exe использует внутри себя экземпляр System.ServiceModel.Description.MetadataExchangeClient и загружает из файла конфигурации приложения конфигурацию конечной точки MEX, имя которой соответствует схеме адреса, переданного средству Svcutil.exe, если такая конечная точка существует. В противном случае средство Svcutil.exe по умолчанию использует одну из привязок, определенных в статическом типе производства MetadataExchangeBindings.
Импорт метаданных службы
В процессе импорта метаданных в WCF создается абстрактное представление службы или ее компонентов на основе этих метаданных. Например, WCF может импортировать экземпляры ServiceEndpoint, Binding или ContractDescription из документа WSDL службы. Чтобы импортировать метаданные службы в WCF, следует использовать реализацию абстрактного класса MetadataImporter. Типы, производные от класса System.ServiceModel.Description.MetadataImporter, реализуют поддержку для импорта форматов метаданных, которые используют преимущества логики импорта WS-Policy в WCF.
Реализация System.ServiceModel.Description.MetadataImporter собирает выражения политики, прикрепленные к метаданным службы в объекте PolicyConversionContext. Затем System.ServiceModel.Description.MetadataImporter обрабатывает политики как часть импорта метаданных путем вызова реализаций интерфейса IPolicyImportExtension в свойстве PolicyImportExtensions.
Можно добавить поддержку для импорта новых утверждений политики в System.ServiceModel.Description.MetadataImporter путем добавления собственной реализации интерфейса IPolicyImportExtension в коллекцию PolicyImportExtensions в экземпляре System.ServiceModel.Description.MetadataImporter. В качестве альтернативы можно зарегистрировать расширение импорта политики в файле конфигурации клиентского приложения.
Тип System.ServiceModel.Description.WsdlImporter является реализацией абстрактного класса System.ServiceModel.Description.MetadataImporter, входящего в WCF. Тип System.ServiceModel.Description.WsdlImporter импортирует метаданные языка WSDL с прикрепленными политиками, объединенными в объекте MetadataSet.
Можно добавить поддержку для импорта расширений языка WSDL путем реализации интерфейса IWsdlImportExtension и добавления реализации в свойство WsdlImportExtensions в экземпляре System.ServiceModel.Description.WsdlImporter. Кроме того, System.ServiceModel.Description.WsdlImporter может загружать реализации интерфейса System.ServiceModel.Description.IWsdlImportExtension, зарегистрированного в файле конфигурации клиентского приложения.
Динамические привязки
Можно динамически обновлять привязку, используемую для создания канала к конечной точке службы, если привязка к конечной точке изменяется, или если необходимо создать канал к конечной точке, которая использует тот же контракт, но имеет другую привязку. С помощью статического класса MetadataResolver можно во время выполнения извлекать и импортировать метаданные для конечных точек службы, реализующих заданный контракт. После этого импортированные объекты System.ServiceModel.Description.ServiceEndpoint можно использовать для создания клиента или производства каналов для выбранной конечной точки.
См. также
Справочник
System.ServiceModel.Description
Основные понятия
Форматы метаданных
Экспорт и импорт метаданных
Публикация метаданных
Извлечение метаданных
Использование метаданных
Security Considerations with Metadata