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


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

Узел службы 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);

Обратите внимание, что проверка отдельных документов метаданных не будет выполнена в документах. Это ответственность за приложение для проверки содержимого документов и обеспечения того, чтобы все пути импорта были относительно указаны.

Указанное пространство имен используется для поиска документа, в котором элемент службы будет добавлен узлом службы.

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