サービス メタデータ
WWSAPI サービス ホストは、そのエンドポイントのWS-MetadataExchangeをサポートしています。 サービス ホストでこのようなメタデータ交換を有効にするには、次の手順を実行します。
- WS_SERVICE_HOSTの WS_SERVICE_METADATA プロパティでメタデータ ドキュメントを指定します。
- WS_SERVICE_HOSTの WS_SERVICE_METADATA プロパティにサービス名を指定します。
- WS_SERVICE_ENDPOINTの WS_SERVICE_ENDPOINT_PROPERTY_METADATA プロパティを使用して、個々の エンドポイントのポートを指定します。
- 1 つ以上 のWS_SERVICE_ENDPOINT 構造体を有効にして、WS-MetadataExchange要求にサービスを提供します。
- 必要に応じて、特定のアドレスで Ws-MetadataExchange 要求を処理するために、 WS_SERVICE_ENDPOINT_PROPERTY_ID 列挙にWS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_URL_SUFFIXを指定します。
サービス ホストでのメタデータ ドキュメント/サービス名の指定
最初の手順では、サービス ホストでメタデータ ドキュメントを指定します。 これを行うには、個々のドキュメントを 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 フィールドと serviceNs フィールドを指定する必要があります。 serviceName と serviceN の両方が NULL の 場合、WSDL ドキュメントにサービス要素は追加されません。 これらはどちらも、serviceElement が追加されるドキュメントを識別するために使用されます。
プロパティWS_SERVICE_PROPERTY_METADATA指定されていない場合、サービス ホストでメタデータの拡張は行われません。
WS_SERVICE_ENDPOINTでのポートの指定
WSDL ドキュメントの service 要素内のポートとしてWS_SERVICE_ENDPOINTを使用できるようにするには、アプリケーションで 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要求のサービスに対して少なくとも 1 つのエンドポイントが有効になっている必要があります。 これを行うには、 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要求のサービスに対して少なくとも 1 つのエンドポイントが有効になっている必要があります。 これを行うには、 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のサフィックスを指定します。 このサフィックスは、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 要素は、サービス メタダに関連しています。
列挙 | 説明 |
---|---|
WS_METADATA_EXCHANGE_TYPE | エンドポイントでWS-MetadataExchangeおよび HTTP GET サービスを有効または無効にします。 |
構造体 | 説明 |
---|---|
WS_SERVICE_ENDPOINT_METADATA | エンドポイントの port 要素を表します。 |
WS_SERVICE_METADATA | サービス メタデータ ドキュメント配列を指定します。 |
WS_SERVICE_METADATA_DOCUMENT | サービス メタデータを構成する個々のドキュメントを指定します。 |