WCF 拡張に対するカスタム メタデータのインポート

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

カスタム メタデータは、システム指定のメタデータ インポーターでインポートできない XML 要素で構成されます。 通常、これにはカスタム WSDL 拡張とカスタム ポリシー アサーションが含まれます。

ここでは、カスタム WSDL 拡張とカスタム ポリシー アサーションをインポートする方法について説明します。 インポート プロセス自体には重点を置きません。 カスタム メタデータであるか、システムがサポートするメタデータであるかに関係なく、メタデータをエクスポートおよびインポートする型の使用方法の詳細については、「メタデータのエクスポートとインポート」を参照してください。

概要

System.ServiceModel.Description.WsdlImporter 型は、WCF に含まれる MetadataImporter 抽象クラスの実装です。 WsdlImporter 型は、System.ServiceModel.Description.MetadataSet オブジェクトにまとめられた、結び付けられているポリシーを使用して WSDL メタデータをインポートします。 既定のインポーターが認識しないポリシー アサーションおよび WSDL 拡張は、インポートに使用される登録済みのカスタム ポリシーおよびカスタム WDSL インポーターに渡されます。 通常、インポーターは、ユーザー定義のバインド要素をサポートしたりインポートされたコントラクトを変更したりする目的で実装されます。

ここでは、次の内容について説明します。

  1. 説明の生成とコードの生成を行う前に、カスタム インポーターに WSDL データを公開する System.ServiceModel.Description.IWsdlImportExtension インターフェイスを実装して使用する方法。 このインターフェイスは、特定のメタデータ セットを使用して実行される説明の種類とコードのコンパイルを確認または変更するために使用できます。

  2. 説明オブジェクトを生成する前に、インポーターにポリシー アサーションを公開する System.ServiceModel.Description.IPolicyImportExtension インターフェイスを実装して使用する方法。 このインターフェイスは、ダウンロードしたポリシーに基づいてバインディングまたはコントラクトを確認または変更するために使用できます。

カスタム WSDL とポリシー アサーションのエクスポートに関する詳細については、「WCF 拡張に対するカスタム メタデータのエクスポート」を参照してください。

カスタム WSDL 拡張のインポート

WSDL 拡張のインポートをサポートするには、IWsdlImportExtension インターフェイスを実装し、その実装を WsdlImportExtensions プロパティに追加します。 WsdlImporter は、アプリケーション構成ファイルに登録された IWsdlImportExtension インターフェイスの実装を読み込むこともできます。 いくつかの WSDL インポーターが既定で登録されること、および登録された WSDL インポーターの順序に意味があることに注意してください。

WsdlImporter は、カスタム WSDL インポーターを読み込んで使用する場合、インポート プロセスの前にメタデータを変更できるように、まず BeforeImport メソッドを呼び出します。 次に、コントラクトがインポートされたら、メタデータからインポートされたコントラクトを変更できるように ImportContract メソッドを呼び出します。 最後に、インポートされたエンドポイントを変更できるように ImportEndpoint メソッドを呼び出します。

詳細については、「方法: カスタム WSDL をインポートする」を参照してください。

カスタム ポリシー アサーションのインポート

WsdlImporter 型と ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) は、WSDL ドキュメントに結び付けられたポリシー表現に含まれるさまざまなポリシー アサーション型を自動的に処理します。 これらのツールは、WSDL バインディングや WSDL ポートに結び付けられたポリシー表現の収集、正規化、およびマージを行います。

カスタム ポリシー アサーションのインポートをサポートするには、IPolicyImportExtension インターフェイスを実装し、その実装を PolicyImportExtensions プロパティに追加します。 MetadataImporter は、アプリケーション構成ファイルに登録された IPolicyImportExtension インターフェイスの実装を読み込むこともできます。 いくつかのポリシー インポーターが既定で登録されること、および登録されたポリシー インポーターの順序に意味があることに注意してください。

メタデータ システムは、登録されたすべてのポリシー インポート拡張で IPolicyImportExtension.ImportPolicy メソッドを呼び出します。これは、メッセージ、操作、およびエンドポイント ポリシーのサブジェクトに結び付けられたポリシー代替手段の各組み合わせに対して行われます。 WSDL ポートをインポートする場合、ポリシー インポート拡張を呼び出す前に、ポートおよび対応する WSDL バインディングに結び付けられているポリシーがマージされます。 このポリシー代替手段は、PolicyConversionContext を通じて、PolicyAssertionCollection オブジェクトとして使用可能になります。 各 PolicyAssertionCollection は、XmlElement オブジェクトによって表されるポリシー アサーションのコレクションです。

Contract オブジェクトの BindingElements プロパティと PolicyConversionContext プロパティは、WSDL からインポートされた ContractDescription オブジェクトと BindingElement オブジェクトを公開します。 ポリシー アサーションを処理する場合、ポリシー インポート拡張は、特定のポリシー アサーション型のインスタンスを見つけ、対応する変更を ContractDescription オブジェクトまたは BindingElement オブジェクトに加えてから、対応する PolicyAssertionCollection からそのポリシー アサーションを削除します。

wsp:Optional 属性および入れ子になったポリシー表現は正規化されないため、ポリシー インポート拡張はこれらのポリシー構文を処理する必要があります。 また、ポリシー インポート拡張は、同じ ContractDescription オブジェクトと BindingElement オブジェクトで何度でも呼び出される可能性があるため、この動作に対して強固である必要があります。

重要

無効なメタデータまたは不適切なメタデータがインポーターに渡される可能性があります。 カスタム インポーターがすべての形式の XML に対して強固であることを確認してください。

関連項目