サービス メタデータ
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 ドキュメント内のサービス要素内のポートとして 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 に as-is 連結されます。 連結された文字列は、受信した '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 | エンドポイントのポート要素を表します。 |
WS_SERVICE_METADATA | サービス メタデータ ドキュメント配列を指定します。 |
WS_SERVICE_METADATA_DOCUMENT | サービス メタデータを構成する個々のドキュメントを指定します。 |