次の方法で共有


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

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

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

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

WCF は、サービスのメタデータを MetadataSet 型のインスタンスとして表します。その構造は、WS-MetadataExchange で定義されているメタデータのシリアル化形式に厳密に関連付けられています。 MetadataSet型は、Web サービス記述言語 (WSDL) ドキュメント、XML スキーマ ドキュメント、WS-Policy 式などの実際のサービス メタデータを、MetadataSection インスタンスのコレクションとしてバンドルします。 各 System.ServiceModel.Description.MetadataSection インスタンスには、特定のメタデータ言語と識別子が含まれています。 System.ServiceModel.Description.MetadataSectionには、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 ドキュメントの生成時にIWsdlExportExtension インターフェイスを実装するバインド要素、操作動作、コントラクト動作、およびエンドポイント動作について、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 つの既定のバインディングのいずれかを使用して、WCF ツールで使用される既定のバインド (Svcutil.exeなど) と一致させることができます。 カスタム バインドを使用して MEX メタデータ エンドポイントを構成することもできます。

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

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

注意事項

アプリケーション構成ファイルに MEX エンドポイントを追加し、コードでサービス ホストに ServiceMetadataBehavior を追加しようとすると、次の例外が発生します。

System.InvalidOperationException: コントラクト名 'IMetadataExchange' が、サービス Service1 によって実装されたコントラクトの一覧に見つかりませんでした。 ServiceMetadataBehavior を構成ファイルまたは ServiceHost に直接追加して、このコントラクトのサポートを有効にします。

この問題を回避するには、構成ファイルに ServiceMetadataBehavior を追加するか、エンドポイントと ServiceMetadataBehavior の両方をコードに追加します。

アプリケーション構成ファイルに ServiceMetadataBehavior を追加する例については、「 概要」を参照してください。 コードに ServiceMetadataBehavior を追加する例については、 セルフホスト のサンプルを参照してください。

注意事項

それぞれが同じ名前の操作を含む 2 つの異なるサービス コントラクトを公開するサービスのメタデータを公開すると、例外がスローされます。 たとえば、操作 Get(Car c) を持つ ICarService というサービス コントラクトを公開するサービスがあり、同じサービスが Get(Book b) 操作を持つ IBookService というサービス コントラクトを公開している場合、例外がスローされるか、サービスのメタデータを生成するときにエラー メッセージが表示されます。 この問題を回避するには、次のいずれかの操作を行います。

  • いずれかの操作の名前を変更します。
  • Nameを別の名前に設定します。
  • Namespace プロパティを使用して、操作のいずれかの名前空間を別の名前空間に設定します。

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

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 インスタンスに関連付けられます。 ChannelFactoryBase仮想メソッドをオーバーライドすることで、System.ServiceModel.Description.MetadataExchangeClientによって使用されるGetChannelFactory インスタンスを変更または置換できます。 同様に、System.Net.HttpWebRequest仮想メソッドをオーバーライドすることで、System.ServiceModel.Description.MetadataExchangeClientによって使用されるMetadataExchangeClient.GetWebRequest インスタンスを変更または置換して、HTTP/GET 要求を行うことができます。

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

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

WCF では、メタデータのインポートは、サービスまたはそのコンポーネント パーツの抽象表現をメタデータから生成するプロセスです。 たとえば、WCF では、サービスの WSDL ドキュメントから、 ServiceEndpoint インスタンス、 Binding インスタンス、または ContractDescription インスタンスをインポートできます。 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 オブジェクトを使用して、目的のエンドポイントにクライアントまたはチャネル ファクトリを作成できます。

こちらも参照ください