Dienstmetadaten
Der WWSAPI-Diensthost unterstützt WS-MetadataExchange für seine Endpunkte. Sie aktivieren diesen Metadatenaustausch auf dem Diensthost mit den folgenden Schritten:
- Geben Sie Metadatendokumente in der eigenschaft WS_SERVICE_METADATA für die WS_SERVICE_HOSTan.
- Geben Sie den Dienstnamen in der eigenschaft WS_SERVICE_METADATA für die WS_SERVICE_HOSTan.
- Geben Sie den Port für einzelne Endpunkte mithilfe der WS_SERVICE_ENDPOINT_PROPERTY_METADATA-Eigenschaft für die WS_SERVICE_ENDPOINTan.
- Aktivieren Sie eine oder mehrere WS_SERVICE_ENDPOINT Strukturen, um die WS-MetadataExchange Anforderungen zu verarbeiten.
- Geben Sie optional WS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_URL_SUFFIX in der WS_SERVICE_ENDPOINT_PROPERTY_ID-Aufzählung für wartungsbezogene Ws-MetadataExchange Anforderungen für eine bestimmte Adresse an.
Angeben von Metadatendokumenten/Dienstnamen auf dem Diensthost
Der erste Schritt besteht darin, die Metadatendokumente auf dem Diensthost anzugeben. Sammeln Sie dazu die einzelnen Dokumente als Array von WS_XML_STRING*s. Diese Zeichenfolgen können XML-Schema, WSDL oder WS-Policy Dokument sein. Dies wird über die WS_SERVICE_PROPERTY_METADATA-Eigenschaft angegeben.
Optional kann eine Anwendung auch den Dienstnamen und den Namespace als Teil der WS_SERVICE_METADATAangeben. Wenn das Metadatendokument das Dienstelement für den angegebenen Dienstnamen nicht angibt, generiert das Dienstmodell ein Dienstelement mit den entsprechenden WSDL-Ports für den Dienst.
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);
Beachten Sie, dass für die Dokumente keine Überprüfung der einzelnen Metadatendokumente durchgeführt wird. Es liegt in der Verantwortung der Anwendung, den Inhalt der Dokumente zu überprüfen und sicherzustellen, dass alle Importpfade relativ angegeben sind.
Der angegebene Namespace wird verwendet, um das Dokument zu finden, in dem das Dienstelement vom Diensthost hinzugefügt wird.
Hinzufügen des Dienstelements zum WSDL-Dokument
Der Diensthost bietet der Anwendung die Möglichkeit, ein Dienstelement in seinem Namen hinzuzufügen, wenn noch kein Dienst angegeben ist. Um dieses Verhalten zu aktivieren, muss eine Anwendung serivceName- und serviceNs-Felder in der WS_SERVICE_METADATA Struktur angeben. Wenn "serviceName" und "serviceNs" beide NULL sind, dem WSDL-Dokument kein Dienstelement hinzugefügt wird. Beide werden verwendet, um das Dokument zu identifizieren, in dem das serviceElement hinzugefügt werden soll.
Wenn WS_SERVICE_PROPERTY_METADATA Eigenschaft nicht angegeben ist, findet kein Metadatenexhange auf dem Diensthost statt.
Angeben des Ports auf dem WS_SERVICE_ENDPOINT
Damit ein WS_SERVICE_ENDPOINT als Port innerhalb des Dienstelements im WSDL-Dokument verfügbar sein kann, muss die Anwendung WS_SERVICE_ENDPOINT_PROPERTY_METADATA Eigenschaft angeben.
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);
Es wird davon ausgegangen, dass der Verweis auf den Bindungsnamen und Namespace in den dokumenten vorhanden ist, die im Rahmen WS_SERVICE_PROPERTY_METADATA auf dem Diensthost angegeben sind. Die Laufzeit überprüft dies nicht im Auftrag der Anwendung.
Aktivieren der WS-MetadataExchange Wartung für WS_SERVICE_ENDPOINT
Um WS-MetadataExchange Anforderungen zu warten, muss der Diensthost mindestens einen Endpunkt für die Wartung WS-MetadataExchange Anforderungen aktiviert haben. Dazu legen Sie die entsprechende Version für WS-MetadataExchange für die WS_SERVICE_ENDPOINTfest.
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);
Aktivieren der HTTP GET-Wartung für WS_SERVICE_ENDPOINT
Um ServiceHTTP GET-Anforderungen auszuführen, muss der Diensthost mindestens einen Endpunkt für die Wartung WS-MetadataExchange Anforderungen aktiviert haben. Dazu legen Sie die entsprechende Version für WS-MetadataExchange für die WS_SERVICE_ENDPOINTfest.
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);
Angeben des URL-Suffixs für Ws-MetadataExchange Anforderungen
Eine Anwendung kann optional nur die Annahme von Anforderungen für WS-MetadataExchange auf einem bestimmten Pfad aktivieren. Dazu wird ein Suffix für die angegebene WS_SERVICE_ENDPOINT angegeben. Dieses Suffix wird as-is mit der tatsächlichen URL für die WS_SERVICE_ENDPOINT verkettet. Die verkettete Zeichenfolge wird als übereinstimmende URL für den empfangenen Header "an" verwendet.
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);
Die folgenden API-Elemente beziehen sich auf dienstmetada.
Aufzählung | Beschreibung |
---|---|
WS_METADATA_EXCHANGE_TYPE | Aktiviert oder deaktiviert WS-MetadataExchange- und HTTP GET-Wartung auf dem Endpunkt. |
Struktur | Beschreibung |
---|---|
WS_SERVICE_ENDPOINT_METADATA | Stellt das Portelement für den Endpunkt dar. |
WS_SERVICE_METADATA | Gibt das Array der Dienstmetadatendokumente an. |
WS_SERVICE_METADATA_DOCUMENT | Gibt die einzelnen Dokumente an, aus denen die Dienstmetadaten bestehen. |