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 WS_SERVICE_METADATA-Eigenschaft auf dem WS_SERVICE_HOST an.
- Geben Sie den Dienstnamen in der WS_SERVICE_METADATA-Eigenschaft auf dem WS_SERVICE_HOST an.
- Geben Sie den Port für einzelne Endpunkte an, indem Sie die Eigenschaft WS_SERVICE_ENDPOINT_PROPERTY_METADATA auf dem WS_SERVICE_ENDPOINT verwenden.
- Aktivieren Sie mindestens eine 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-Enumeration für die Wartung 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. Dazu sammeln Sie die einzelnen Dokumente als Array von WS_XML_STRING*s. Diese Zeichenfolgen können XML-Schema, WSDL oder WS-Policy Dokument sein. Dies wird durch die eigenschaft WS_SERVICE_PROPERTY_METADATA angegeben.
Optional kann eine Anwendung auch den Dienstnamen und den Namespace als Teil der WS_SERVICE_METADATA angeben. 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 keine Überprüfung der einzelnen Metadatendokumente für die Dokumente 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 suchen, in dem das Dienstelement vom Diensthost hinzugefügt wird.
Hinzufügen eines Dienstelements zum WSDL-Dokument
Der Diensthost bietet der Anwendung die Möglichkeit, in ihrem Namen ein Dienstelement hinzuzufügen, wenn es noch nicht angegeben ist. Um dieses Verhalten zu aktivieren, muss eine Anwendung die Felder serivceName und serviceNs in der WS_SERVICE_METADATA Struktur angeben. Wenn serviceName und serviceNs null sind, wird dem WSDL-Dokument kein Dienstelement hinzugefügt. Beide werden verwendet, um ein Dokument zu identifizieren, in dem das serviceElement hinzugefügt werden soll.
Wenn WS_SERVICE_PROPERTY_METADATA Eigenschaft nicht angegeben ist, erfolgt kein Metadatenexhange auf dem Diensthost.
Angeben des Ports auf dem WS_SERVICE_ENDPOINT
Damit ein WS_SERVICE_ENDPOINT als Port innerhalb des Dienstelements im WSDL-Dokument verfügbar ist, 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 auf dem Diensthost als Teil von WS_SERVICE_PROPERTY_METADATA angegeben sind. Die Runtime überprüft dies nicht im Auftrag der Anwendung.
Aktivieren WS-MetadataExchange Wartung auf WS_SERVICE_ENDPOINT
Um WS-MetadataExchange Anforderungen zu warten, muss der Diensthost mindestens einen Endpunkt für die Wartung WS-MetadataExchange Anforderungen aktiviert haben. Hierzu legen Sie die entsprechende Version für WS-MetadataExchange auf dem WS_SERVICE_ENDPOINT fest.
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 auf WS_SERVICE_ENDPOINT
DamitHTTP GET-Anforderungen bereitgestellt werden können, muss für den Diensthost mindestens ein Endpunkt für die Wartung WS-MetadataExchange Anforderungen aktiviert sein. Hierzu legen Sie die entsprechende Version für WS-MetadataExchange auf dem WS_SERVICE_ENDPOINT fest.
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 das Akzeptieren von Anforderungen für WS-MetadataExchange für einen bestimmten Pfad aktivieren. Hierzu wird ein Suffix für die angegebene WS_SERVICE_ENDPOINT angegeben. Dieses Suffix wird unverändert mit der tatsächlichen URL für die WS_SERVICE_ENDPOINT verkettet. Die verkettete Zeichenfolge wird als übereinstimmende URL zum empfangenen "to"-Header 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.
Enumeration | 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. |