Teilen über


Dienstmetadaten

Der WWSAPI-Diensthost unterstützt WS-MetadataExchange für seine Endpunkte. Sie aktivieren diesen Metadatenaustausch auf dem Diensthost mit den folgenden Schritten:

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.