Общие сведения об архитектуре метаданных
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 объекта MetadataSection.Metadata может содержать следующие элементы.
Необработанные метаданные.
Экземпляр класса 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-MetadataExchange или конечные точки 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, переопределив виртуальный метод MetadataExchangeClient.GetWebRequest.
Вы можете получить метаданные службы с помощью 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 можно использовать для создания клиента или производства каналов для выбранной конечной точки.