共用方式為


服務元數據

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 檔

如果尚未指定服務專案,服務主機會提供讓應用程式代表其新增服務元素的設施。 若要啟用此行為,應用程式必須在 WS_SERVICE_METADATA 結構上指定 serivceName 和 serviceN 字段。 如果 serviceName 和 serviceN 都 NULL 就不會將服務元素新增至 WSDL 檔。 這兩者都用來識別要新增 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_SERVICE_ENDPOINT上啟用 WS-MetadataExchange 服務

為了服務 WS-MetadataExchange 要求,服務主機必須至少啟用一個端點,才能維護 WS-MetadataExchange 要求。 這是藉由在 WS_SERVICE_ENDPOINT上為 WS-MetadataExchange 設定適當的版本來完成。

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);

在 WS_SERVICE_ENDPOINT 上啟用 HTTP GET 服務

為了服務HTTP GET 要求,服務主機必須至少啟用一個端點,才能維護 WS-MetadataExchange 要求。 這是藉由在 WS_SERVICE_ENDPOINT上為 WS-MetadataExchange 設定適當的版本來完成。

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);

指定 Ws-MetadataExchange 要求的 URL 後綴

應用程式可以選擇性地只接受特定路徑上 WS-MetadataExchange 的要求。 這是藉由指定指定WS_SERVICE_ENDPOINT的後綴來完成。 這個後綴會串連 as-is 至WS_SERVICE_ENDPOINT的實際 URL。 串連字串會當做接收之 『to』 標頭的相符 URL 使用。

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 元素與服務 Metada 相關。

列舉 描述
WS_METADATA_EXCHANGE_TYPE 啟用或停用端點上的 WS-MetadataExchange 和 HTTP GET 服務。

 

結構 描述
WS_SERVICE_ENDPOINT_METADATA 表示連接點的埠專案。
WS_SERVICE_METADATA 指定服務元數據檔陣列。
WS_SERVICE_METADATA_DOCUMENT 指定組成服務元數據的個別檔。