Метаданные службы
Узел службы 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);
Обратите внимание, что проверка отдельных документов метаданных для документов не выполняется. Приложение отвечает за проверку содержимого документов и обеспечение относительного указания всех путей импорта.
Указанное пространство имен используется для поиска документа, в котором элемент службы будет добавлен узлом службы.
Добавление элемента service в документ WSDL
Узел службы предоставляет приложению возможность добавить элемент службы от его имени, если он еще не указан. Чтобы включить такое поведение, приложение должно указать поля serivceName и serviceNs в структуре WS_SERVICE_METADATA . Если serviceName и serviceNs имеют значение NULL , в документ WSDL не добавляется элемент service. Оба они используются для идентификации документа, в который будет добавлен serviceElement.
Если WS_SERVICE_PROPERTY_METADATA свойство не указано, на узле службы не будет выполняться извлечение метаданных.
Указание порта в 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
Чтобы обслуживать запросы GETHTTP, на узле службы должна быть включена по крайней мере одна конечная точка для обслуживания 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. Этот суффикс объединяется как есть с фактическим 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 относятся к service metada.
Перечисление | Описание |
---|---|
WS_METADATA_EXCHANGE_TYPE | Включает или отключает обслуживание WS-MetadataExchange и HTTP GET в конечной точке. |
Структура | Описание |
---|---|
WS_SERVICE_ENDPOINT_METADATA | Представляет элемент порта для конечной точки. |
WS_SERVICE_METADATA | Задает массив документов метаданных службы. |
WS_SERVICE_METADATA_DOCUMENT | Указывает отдельные документы, составляющие метаданные службы. |