服務元數據
WWSAPI 服務主機支援其端點 WS-MetadataExchange。 您可以使用下列步驟在服務主機上啟用這類元資料交換:
- 在 WS_SERVICE_HOST的 WS_SERVICE_METADATA 屬性中指定元數據檔。
- 在 WS_SERVICE_HOST的 WS_SERVICE_METADATA 屬性中指定服務名稱。
- 使用 WS_SERVICE_ENDPOINT上的 WS_SERVICE_ENDPOINT_PROPERTY_METADATA 屬性,指定個別端點的埠。
- 啟用一或多個 WS_SERVICE_ENDPOINT 結構來服務 WS-MetadataExchange 要求。
- 選擇性地在 WS_SERVICE_ENDPOINT_PROPERTY_ID 列舉中指定 WS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_URL_SUFFIX,以在特定位址上維護 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 | 指定組成服務元數據的個別檔。 |