Windows Communication Foundation (WCF) では、メタデータのインポートは、サービスまたはそのコンポーネント パーツの抽象表現をメタデータから生成するプロセスです。 たとえば、WCF では、サービスの WSDL ドキュメントから、 ServiceEndpoint インスタンス、 Binding インスタンス、または ContractDescription インスタンスをインポートできます。 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 拡張機能は、登録されているカスタム ポリシーと WSDL インポーターに渡され、インポートされます。 通常、インポーターは、ユーザー定義のバインド要素をサポートしたり、インポートされたコントラクトを変更したりするために実装されます。
このセクションでは、次について説明します。
記述の生成とコードの生成の前に WSDL データをカスタム インポーターに公開する System.ServiceModel.Description.IWsdlImportExtension インターフェイスを実装して使用する方法。 このインターフェイスを使用すると、特定のメタデータ セットを使用して実行される説明の種類とコード コンパイルを確認または変更できます。
説明オブジェクトの生成前にポリシー アサーションをインポーターに公開する System.ServiceModel.Description.IPolicyImportExtension インターフェイスを実装して使用する方法。 このインターフェイスを使用して、ダウンロードしたポリシーに基づいてバインディングまたはコントラクトを調べたり変更したりできます。
カスタム WSDL およびポリシー アサーションのエクスポートの詳細については、「 WCF 拡張機能のカスタム メタデータのエクスポート」を参照してください。
カスタム WSDL 拡張機能のインポート
WSDL 拡張機能のインポートのサポートを追加するには、 IWsdlImportExtension インターフェイスを実装してから、 WsdlImportExtensions プロパティに実装を追加します。 WsdlImporterは、アプリケーション構成ファイルに登録されているIWsdlImportExtension インターフェイスの実装を読み込むこともできます。 既定では、多数の WSDL インポーターが登録されており、登録されている WSDL インポーターの順序が重要であることに注意してください。
カスタム WSDL インポーターが読み込まれ、 WsdlImporterによって使用されると、最初に 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 オブジェクトで複数回呼び出される可能性があるため、ポリシー インポート拡張機能は、この動作に対して堅牢である必要があります。
Von Bedeutung
インポーターに無効なメタデータまたは不適切なメタデータを渡すことができます。 カスタム インポーターがあらゆる形式の XML に対して堅牢であることを確認します。