Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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 экземпляр содержит определенный диалект метаданных и идентификатор. A 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 интерфейс. WsdlExporter анализирует экземпляр ServiceEndpoint для поиска элементов привязки, поведения операций, поведения контракта и поведения конечной точки, реализующих интерфейс IWsdlExportExtension, при генерации документа WSDL.
Метаданные службы публикации
Службы 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 можно разрешить ссылки HTTP-URL на метаданные с помощью типа 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 объекты для создания фабрики клиентов или каналов для нужной конечной точки.