IPolicyImportExtension インターフェイス
TOC
目次を折りたたむ
目次を展開する
この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

IPolicyImportExtension インターフェイス

 

バインディングに関するカスタム ポリシー アサーションをインポートするオブジェクトのメソッドを定義します。

名前空間:   System.ServiceModel.Description
アセンブリ:  System.ServiceModel (System.ServiceModel.dll 内)

public interface IPolicyImportExtension

名前説明
System_CAPS_pubmethodImportPolicy(MetadataImporter, PolicyConversionContext)

カスタム ポリシー アサーションをインポートして実装するバインディング要素を追加できるメソッドを定義します。

特定のエンドポイントによって公開されている WSDL 情報でエンドポイントの機能または要件に関するカスタム ポリシー アサーションを検索するには、IPolicyImportExtension インターフェイスを実装します。 通常、ポリシー インポーターは特定のアサーションを検索し、そのアサーションの要件をサポートするバインディング要素を挿入または構成したり、そのアサーションの要件をサポートするコントラクトを変更したりします。

対応する IPolicyExportExtension とは異なり、IPolicyImportExtension は、BindingElement オブジェクトによる実装を必要としません。「使用例」で示されているクライアント構成セクションを使用するか、またはプログラムで System.ServiceModel.Description.WsdlImporter コンストラクターに追加することによって読み込むことができます。

Windows Communication Foundation (WCF) は、2 つのオブジェクト (ImportPolicy および MetadataImporter) を PolicyConversionContext メソッドに渡します。 通常、PolicyConversionContext オブジェクトには既に各バインディング スコープのポリシー アサーションが含まれています。

IPolicyImportExtension 実装は、次の手順を実行します。

  1. 機能させるカスタム ポリシー アサーションを検索します。このためには、スコープに応じて、GetBindingAssertionsGetMessageBindingAssertionsGetOperationBindingAssertions のいずれかのメソッドを呼び出します。

  2. アサーション コレクションからポリシー アサーションを削除します。 PolicyAssertionCollection.Remove メソッドは、一度にアサーションを検索し、返し、削除します。

  3. バインディング スタックまたはコントラクトを変更します。このためには、必要なカスタム BindingElementBindingElements プロパティに追加するか、PolicyConversionContext.Contract プロパティを変更します。

手順 2. は重要です。 すべてのポリシー インポーターが呼び出された後、WCF は、残っているポリシー アサーションがあるかをチェックします。 アサーションが存在する場合、WCF は、ポリシーのインポートが失敗して関連付けられているバインディングがインポートされていないと見なします。

System_CAPS_important重要

悪意のあるメタデータ提供者が、ポリシー インポーターを悪用する目的で、不正な XML をメタデータの一部として送信しようとする可能性があります。 カスタム ポリシー インポーターは、渡される可能性のあるすべての形式の XML に対して強固にすることをお勧めします。

MetadataImporter のカスタム実装は、それら独自の PolicyConversionContext オブジェクトを実装してカスタム メタデータ形式に結び付けられているポリシー アサーションを抽出する必要があります。

ポリシー アサーションではないカスタム WSDL 要素をエクスポートおよびインポートする場合については、System.ServiceModel.Description.IWsdlExportExtension および System.ServiceModel.Description.IWsdlImportExtension を参照してください。

System_CAPS_noteメモ

カスタム ポリシー インポーターとカスタム ポリシー エクスポーターは、構成ファイル内の同じ構成要素と ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) オプションを使用することにより、/svcutilConfig:<configFile> で使用できます。

PolicyAssertionCollection.Remove メソッドを使用してアサーションを一度に検索し、返し、削除する方法を次のコード例に示します。

  #region IPolicyImporter Members
  public const string name1 = "acme";
  public const string ns1 = "http://Microsoft/WCF/Documentation/CustomPolicyAssertions";

  /*
   * Importing policy assertions usually means modifying the bindingelement stack in some way
   * to support the policy assertion. The procedure is:
   * 1. Find the custom assertion to import.
   * 2. Insert a supporting custom bindingelement or modify the current binding element collection
   *     to support the assertion.
   * 3. Remove the assertion from the collection. Once the ImportPolicy method has returned, 
   *     any remaining assertions for the binding cause the binding to fail import and not be 
   *     constructed.
   */
  public void ImportPolicy(MetadataImporter importer, PolicyConversionContext context)
  {
    Console.WriteLine("The custom policy importer has been called.");
    // Locate the custom assertion and remove it.
    XmlElement customAssertion = context.GetBindingAssertions().Remove(name1, ns1);
    if (customAssertion != null)
    {
      Console.WriteLine(
        "Removed our custom assertion from the imported "
        + "assertions collection and inserting our custom binding element."
      );
      // Here we would add the binding modification that implemented the policy.
      // This sample does not do this.
      Console.ForegroundColor = ConsoleColor.Red;
      Console.WriteLine(customAssertion.NamespaceURI + " : " + customAssertion.Name);
      Console.WriteLine(customAssertion.OuterXml);
      Console.ForegroundColor = ConsoleColor.Gray;
    }
 }
#endregion

System.ServiceModel.Description.MetadataResolver が呼び出されたときにカスタム ポリシー インポーターを読み込むクライアント アプリケーション構成ファイルを次のコード例に示します。

MetadataResolver を使用して、メタデータをダウンロードし説明オブジェクトに解決する方法を次のコード例に示します。

// Download all metadata. 
ServiceEndpointCollection endpoints
  = MetadataResolver.Resolve(
    typeof(IStatefulService),
    new EndpointAddress("http://localhost:8080/StatefulService/mex")
  );

.NET Framework
3.0 から利用可能
トップに戻る
表示:
© 2016 Microsoft