次の方法で共有


メタデータ アーキテクチャの概要

Windows Communication Foundation (WCF) には、サービス メタデータをエクスポート、公開、取得、およびインポートするためのさまざまなインフラストラクチャが用意されています。WCF サービスは、メタデータを使用してサービスのエンドポイントとの対話方法を記述することで、Svcutil.exe などのツールでサービスにアクセスするためのクライアント コードを自動的に生成できるようにします。

WCF メタデータ インフラストラクチャを構成するほとんどの型が、System.ServiceModel.Description 名前空間に存在します。

WCF は、ServiceEndpoint クラスを使用して、サービス内のエンドポイントを記述します。WCF を使用すると、サービス エンドポイント用のメタデータを生成したり、サービス メタデータをインポートして ServiceEndpoint インスタンスを生成したりできます。

WCF は、MetadataSet 型のインスタンスとしてサービスのメタデータを表現します。その構造は、WS-MetadataExchange で定義されているメタデータのシリアル化形式に強く関連付けられています。MetadataSet 型は、Web サービス記述言語 (WSDL: Web Services Description Language) ドキュメント、XML スキーマ ドキュメント、WS-Policy 表現などの実際のサービス メタデータを MetadataSection インスタンスのコレクションとしてバンドルします。各 System.ServiceModel.Description.MetadataSection インスタンスには、特定のメタデータ言語と識別子が含まれます。System.ServiceModel.Description.MetadataSection はその System.ServiceModel.Description.MetadataSection.Metadata プロパティに、次のアイテムを含むことができます。

System.ServiceModel.Description.MetadataReference インスタンスは別のメタデータ交換 (MEX) エンドポイントをポイントし、System.ServiceModel.Description.MetadataLocation インスタンスは HTTP URL を使用してメタデータ ドキュメントをポイントします。WCF は、サービスで実装するサービス エンドポイント、サービス コントラクト、バインディング、メッセージ交換パターン、メッセージ、およびエラー メッセージを記述するために WSDL ドキュメントの使用をサポートします。サービスで使用されるデータ型は、XML スキーマを使用して WSDL ドキュメントに記述されます。詳細な情報については、次のページを参照してください。 「スキーマのインポートとエクスポート」を参照してください。WCF を使用すると、サービス動作、コントラクト動作、およびバインディング要素の WSDL 拡張をエクスポートおよびインポートでき、この拡張により、サービスの機能が拡張されます。詳細な情報については、次のページを参照してください。 「WCF 拡張に対するカスタム メタデータのエクスポート」を参照してください。

サービス メタデータのエクスポート

WCF では、メタデータのエクスポートは、サービス エンドポイントを説明したり、それらを対応する標準化表現に投影したりするプロセスです。クライアントはこのプロセスを利用してサービスの使用方法を理解します。**メタデータを ServiceEndpoint インスタンスからエクスポートするには、MetadataExporter 抽象クラスの実装を使用します。System.ServiceModel.Description.MetadataExporter の実装によって、MetadataSet インスタンスにカプセル化されたメタデータが生成されます。

System.ServiceModel.Description.MetadataExporter クラスには、エンドポイント バインディングの機能と要件、エンドポイントに関連付けられた処理、メッセージ、エラーを記述するポリシー式を生成するためのフレームワークが用意されています。これらのポリシー式は、PolicyConversionContext インスタンスにキャプチャされます。System.ServiceModel.Description.MetadataExporter を実装すると、生成したメタデータにこれらのポリシー表現を結び付けることができます。

System.ServiceModel.Description.MetadataExporter は、System.ServiceModel.Description.MetadataExporter の実装が使用する PolicyConversionContext オブジェクトを生成するときに、ServiceEndpoint のバインディングで IPolicyExportExtension インターフェイスを実装する各 System.ServiceModel.Channels.BindingElement を呼び出します。BindingElement 型のカスタム実装で IPolicyExportExtension インターフェイスを実装することで、新規のポリシー アサーションをエクスポートできます。

WsdlExporter 型は、WCF に含まれる System.ServiceModel.Description.MetadataExporter 抽象クラスの実装です。WsdlExporter 型は、結び付けられたポリシー表現を使用して WSDL メタデータを生成します。

サービス エンドポイントでのエンドポイント動作、コントラクト動作、またはバインディング要素のカスタム WSDL メタデータまたは WSDL 拡張をエクスポートするには、IWsdlExportExtension インターフェイスを実装する必要があります。WsdlExporter は WSDL ドキュメントの生成時に、IWsdlExportExtention インターフェイスを実装するバインディング要素、処理動作、コントラクト動作、およびエンドポイント動作の ServiceEndpoint インスタンスを参照します。

サービス メタデータの公開

WCF サービスは 1 つ以上のメタデータ エンドポイントを公開することにより、メタデータを公開します。サービス メタデータを公開すると、サービス メタデータで MEX や HTTP/GET 要求などの標準化プロトコルを使用できるようになります。メタデータ エンドポイントは、アドレス、バインディング、およびコントラクトを持つという点で、他のサービス エンドポイントと似ています。メタデータ エンドポイントは、構成またはコードを使用してサービス ホストに追加できます。

WCF サービスのメタデータ エンドポイントを公開するには、最初に ServiceMetadataBehavior サービス動作のインスタンスをサービスに追加しておく必要があります。サービスに System.ServiceModel.Description.ServiceMetadataBehavior インスタンスを追加することによって、1 つ以上のメタデータ エンドポイントを公開することでメタデータを公開する機能がサービスに追加されます。System.ServiceModel.Description.ServiceMetadataBehavior サービス動作を追加すると、MEX プロトコルをサポートするメタデータ エンドポイント、または HTTP/GET 要求に応答するメタデータ エンドポイントを公開できます。

MEX プロトコルを使用するメタデータ エンドポイントを追加するには、IMetadataExchange という名前のサービス コントラクトを使用するサービス エンドポイントをサービス ホストに追加します。WCF により、このサービス コントラクト名を持つ IMetadataExchange インターフェイスが定義されます。WS-MetadataExchange のエンドポイント、つまり MEX エンドポイントは、MetadataExchangeBindings クラスで静的ファクトリ メソッドが公開する 4 つの既定のバインディングの 1 つを使用して、WCF ツール (Svcutil.exe など) によって使用される既定のバインディングを照合できます。また、カスタム バインディングを使用して MEX メタデータ エンドポイントを構成することもできます。

ServiceMetadataBehaviorSystem.ServiceModel.Description.WsdlExporter を使用して、サービス内のすべてのサービス エンドポイント用のメタデータをエクスポートします。サービスからメタデータをエクスポートする方法詳細については、 、「メタデータのエクスポートとインポート」を参照してください。

ServiceMetadataBehavior は、ServiceMetadataExtension インスタンスを拡張としてサービス ホストに追加することで、サービス ホストを拡張します。System.ServiceModel.Description.ServiceMetadataExtension により、メタデータ公開プロトコルを実装することができます。また、System.ServiceModel.Description.ServiceMetadataExtension を使用して、Metadata プロパティにアクセスすることにより、実行時にサービスのメタデータを取得できます。

サービス メタデータの取得

WCF は WS-MetadataExchange、HTTP などの標準化プロトコルを使用してサービス メタデータを取得できます。これらのプロトコルはいずれも、MetadataExchangeClient 型でサポートされます。アドレスとオプションのバインディングを提供することによって、System.ServiceModel.Description.MetadataExchangeClient 型を使用して、サービス メタデータを取得します。System.ServiceModel.Description.MetadataExchangeClient インスタンスで使用するバインディングは、MetadataExchangeBindings 静的クラスの既定のバインディング、ユーザー指定のバインディング、IMetadataExchange コントラクト用のエンドポイント構成から読み込まれたバインディングのいずれかです。System.ServiceModel.Description.MetadataExchangeClient は同様に、HttpWebRequest 型を使用して、メタデータへの HTTP URL 参照を解決できます。

既定では、System.ServiceModel.Description.MetadataExchangeClient インスタンスは、1 つの ChannelFactoryBase インスタンスに結び付けられています。System.ServiceModel.Description.MetadataExchangeClient によって使用される ChannelFactoryBase インスタンスは、GetChannelFactory 仮想メソッドを上書きすることによって変更または置換することができます。同様に、System.ServiceModel.Description.MetadataExchangeClient.GetWebRequest(System.Uri,System.String,System.String) 仮想メソッドをオーバーライドすることによって、HTTP/GET 要求を行うために System.ServiceModel.Description.MetadataExchangeClient が使用する System.Net.HttpWebRequest インスタンスを変更または置換できます。

Svcutil.exe ツールを使用して /target:metadata スイッチとアドレスを渡すことにより、WS-MetadataExchange 要求または HTTP/GET 要求を使用してサービス メタデータを取得できます。Svcutil.exe は指定したアドレスでメタデータをダウンロードし、ディスクにファイルを保存します。Svcutil.exe は、System.ServiceModel.Description.MetadataExchangeClient インスタンスを内部的に使用し、Svcutil.exe に渡されたアドレスのスキームに一致する名前を持つ MEX エンドポイント構成が存在する場合は、これをアプリケーション構成ファイルから読み込みます。存在しない場合、Svcutil.exe は、MetadataExchangeBindings 静的ファクトリ型によって定義されたバインディングの 1 つを既定で使用します。

サービス メタデータのインポート

WCF では、メタデータのインポートとは、サービス、またはサービスのコンポーネントの抽象表現をサービスのメタデータから生成するプロセスです。たとえば、WCF は、ServiceEndpoint インスタンス、Binding インスタンス、または ContractDescription インスタンスをサービスの WSDL ドキュメントからインポートできます。WCF のサービス メタデータをインポートするには、MetadataImporter 抽象クラスの実装を使用します。System.ServiceModel.Description.MetadataImporter クラスから派生した型では、WCF の WS-Policy インポート ロジックを利用したメタデータ形式のインポートをサポートします。

System.ServiceModel.Description.MetadataImporter の実装は、PolicyConversionContext オブジェクトでサービス メタデータに結び付けられたポリシー表現を収集します。その後、System.ServiceModel.Description.MetadataImporter は、PolicyImportExtensions プロパティ内の IPolicyImportExtension インターフェイスの実装を呼び出すことによって、メタデータのインポートの一部として、ポリシーを処理します。

System.ServiceModel.Description.MetadataImporter インスタンスの PolicyImportExtensions コレクションに IPolicyImportExtension インターフェイスの独自の実装を追加することによって、新しいポリシー アサーションをインポートするためのサポートを System.ServiceModel.Description.MetadataImporter に追加できます。または、クライアント アプリケーション構成ファイルにポリシー インポート拡張を登録できます。

System.ServiceModel.Description.WsdlImporter 型は、WCF に含まれる System.ServiceModel.Description.MetadataImporter 抽象クラスの実装です。System.ServiceModel.Description.WsdlImporter 型は、MetadataSet オブジェクトにまとめられた、結び付けられているポリシーを使用して WSDL メタデータをインポートします。

IWsdlImportExtension インターフェイスを実装し、この実装を System.ServiceModel.Description.WsdlImporter インスタンスの WsdlImportExtensions プロパティに追加することで、WSDL 拡張のインポートのサポートを追加できます。System.ServiceModel.Description.WsdlImporter は、クライアント アプリケーション構成ファイルに登録された System.ServiceModel.Description.IWsdlImportExtension インターフェイスの実装を読み込むこともできます。

動的なバインド

エンドポイントのバインドが変化するイベントでサービス エンドポイントへのチャネルを作成する、または、同じコントラクトを使用しているがバインドが異なるエンドポイントへのチャネルを作成するために使用するバインドを動的に更新することができます。MetadataResolver 静的クラスを使用して、特定のコントラクトを実装しているサービス エンドポイントのメタデータを、実行時に取得またはインポートできます。その後、インポートした System.ServiceModel.Description.ServiceEndpoint オブジェクトを使用して、必要なエンドポイントに対するクライアントまたはチャネル ファクトリを作成できます。

関連項目

リファレンス

System.ServiceModel.Description

概念

メタデータ形式
メタデータのエクスポートとインポート
メタデータの公開
メタデータを取得する
メタデータを使用する
メタデータを使用する場合のセキュリティ上の考慮事項

その他の技術情報

メタデータ システムの拡張