Поделиться через


Метаданные службы

Узел службы WWSAPI поддерживает 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 Указывает отдельные документы, составляющие метаданные службы.