Метаданные службы
Узел службы WWSAPI поддерживает WS-MetadataExchange для конечных точек. Чтобы включить обмен такими метаданными на узле службы, выполните следующие действия.
- Укажите документы метаданных в свойстве WS_SERVICE_METADATA в WS_SERVICE_HOST.
- Укажите имя службы в свойстве WS_SERVICE_METADATA в WS_SERVICE_HOST.
- Укажите порт для отдельных конечных точек с помощью свойства WS_SERVICE_ENDPOINT_PROPERTY_METADATA в WS_SERVICE_ENDPOINT.
- Включите одну или несколько структур WS_SERVICE_ENDPOINT для обслуживания запросов WS-MetadataExchange.
- При необходимости укажите WS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_URL_SUFFIX в перечислении WS_SERVICE_ENDPOINT_PROPERTY_ID для обслуживания запросов Ws-MetadataExchange по конкретному адресу.
Указание документов метаданных или имени службы на узле службы
Первым шагом является указание документов метаданных на узле службы. Для этого собирайте отдельные документы в виде массива WS_XML_STRING*. Эти строки могут быть XML-схемой, WSDL или документом WS-Policy. Это указывается с помощью свойства WS_SERVICE_PROPERTY_METADATA.
При необходимости приложение также может указать имя службы и пространство имен в рамках WS_SERVICE_METADATA. Если документ метаданных не указывает элемент службы для заданного имени службы, модель службы создаст элемент службы с соответствующими портами WSDL для службы.
WS_SERVICE_METADATA_DOCUMENT document = {0};
WS_STRING documentName = WS_STRING_VALUE(L"a.wsdl");
document.name = &documentName;
document.content = &wsdlDocument
WS_SERVICE_METADATA_DOCUMENT** metadataDocuments [] = {&document};
WS_SERVICE_METADATA serviceMetadata = {0};
// Specify Metadata documents
serviceMetadata.count = WsCountOf(metadataDocuments);
serviceMetadata.documents = &metadataDocuments;
// Specify service name
serviceMetadata.serviceName = &serviceName;
serviceMetadata.serviceNs = &serviceNamespace;
WS_SERVICE_PROPERTY serviceProperties[1] = {0};
serviceProperties[0].id = WS_SERVICE_PROPERTY_METADATA;
serviceProperties[0].value = &serviceMetadata;
serviceProperties[0].ValueSize = sizeof(serviceMetadata);
Обратите внимание, что проверка отдельных документов метаданных не будет выполнена в документах. Это ответственность за приложение для проверки содержимого документов и обеспечения того, чтобы все пути импорта были относительно указаны.
Указанное пространство имен используется для поиска документа, в котором элемент службы будет добавлен узлом службы.
Добавление элемента службы в документ WSDL
Узел службы предоставляет возможность для приложения добавить элемент службы от его имени, если он еще не указан. Чтобы включить это поведение, приложению необходимо указать поля serivceName и serviceNs в структуре WS_SERVICE_METADATA. Если serviceName и serviceNs оба NULL элемент службы не добавляется в документ WSDL. Они используются для идентификации документа, в котором будет добавлен serviceElement.
Если свойство WS_SERVICE_PROPERTY_METADATA не указано, на узле службы будут выполняться никакие exhange метаданные.
Указание порта в WS_SERVICE_ENDPOINT
Чтобы WS_SERVICE_ENDPOINT был доступен как порт внутри элемента службы в документе WSDL, приложение должно указать в нем свойство WS_SERVICE_ENDPOINT_PROPERTY_METADATA.
WS_SERVICE_ENDPOINT_METADATA endpointPort = {0}
endpointPort.name = &portName;
endpointPort.bindingName = &bindingName;
endpointPort.bindingNs = &bindingNs;
WS_SERVICE_ENDPOINT_PROPERTY serviceProperties[1] = {0};
serviceProperties[0].id = WS_SERVICE_ENDPOINT_PROPERTY_METADATA;
serviceProperties[0].value = &endpointPort;
serviceProperties[0].valueSize = sizeof(endpointPort);
Предполагается, что ссылка на имя привязки и пространство имен существует в документах, указанных на узле службы в рамках WS_SERVICE_PROPERTY_METADATA. Среда выполнения не проверяет это от имени приложения.
Включение обслуживания WS-MetadataExchange на WS_SERVICE_ENDPOINT
Для обслуживания WS-MetadataExchange запросов узел службы должен иметь по крайней мере одну конечную точку для обслуживания WS-MetadataExchange запросов. Это делается путем установки соответствующей версии для WS-MetadataExchange на WS_SERVICE_ENDPOINT.
WS_METADATA_EXCHANGE_TYPE metadataExchangeType = WS_METADATA_EXCHANGE_TYPE_MEX;
WS_SERVICE_ENDPOINT_PROPERTY serviceProperties[1] = {0};
serviceProperties[0].id = WS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_TYPE;
serviceProperties[0].value = &metadataExchangeType;
serviceProperties[0].ValueSize = sizeof(metadataExchangeType);
Включение обслуживания HTTP GET в WS_SERVICE_ENDPOINT
Чтобы выполнить запросы GET на serviceHTTP, узел службы должен иметь по крайней мере одну конечную точку для обслуживания WS-MetadataExchange запросов. Это делается путем установки соответствующей версии для WS-MetadataExchange на WS_SERVICE_ENDPOINT.
WS_METADATA_EXCHANGE_TYPE metadataExchangeType = WS_METADATA_EXCHANGE_TYPE_HTTP_GET;
WS_SERVICE_ENDPOINT_PROPERTY serviceProperties[1] = {0};
serviceProperties[0].id = WS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_TYPE;
serviceProperties[0].value = &metadataExchangeType;
serviceProperties[0].ValueSize = sizeof(metadataExchangeType);
Указание суффикса URL-адреса для запросов Ws-MetadataExchange
Приложение может дополнительно включить только прием запросов для WS-MetadataExchange по конкретному пути. Это делается путем указания суффикса для заданного WS_SERVICE_ENDPOINT. Этот суффикс объединяется as-is с фактическим URL-адресом для WS_SERVICE_ENDPOINT. Сцепленная строка используется в качестве соответствующего URL-адреса для полученного заголовка to.
const WS_STRING suffix = WS_STRING_VALUE(L"mex");
WS_SERVICE_ENDPOINT_PROPERTY serviceProperties[1] = {};
serviceProperties[0].id = WS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_URL_SUFFIX;
serviceProperties[0].value = &suffix;
serviceProperties[0].valueSize = sizeof(suffix);
Следующие элементы API относятся к метадам службы.
Перечисление | Описание |
---|---|
WS_METADATA_EXCHANGE_TYPE | Включает или отключает обслуживание WS-MetadataExchange и HTTP GET в конечной точке. |
Структура | Описание |
---|---|
WS_SERVICE_ENDPOINT_METADATA | Представляет элемент порта для конечной точки. |
WS_SERVICE_METADATA | Задает массив документов метаданных службы. |
WS_SERVICE_METADATA_DOCUMENT | Указывает отдельные документы, составляющие метаданные службы. |