次の方法で共有


手順 4: エコー アダプターのメタデータ参照ハンドラーを実装する

手順 4/9

完了までの時間: 45 分

この手順では、エコー アダプターの参照機能を実装します。 この機能により、アダプターは接続ベースの参照を実行して、ターゲット システムからメタデータを取得できます。 アダプターの機能に関係なく、アダプターは参照機能をサポートする必要があります。

WCF LOB アダプター SDK によると、参照機能をサポートするには、 Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler インターフェイスを実装する必要があります。 エコー アダプターの場合、アダプター開発ウィザードは、EchoAdapterMetadataBrowseHandler という名前の派生クラスを自動的に生成します。

次の手順では、このクラスを更新して、 Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler.Browse%2A メソッドを実装する方法、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトのさまざまなプロパティを設定する方法、アダプターでサポートされる操作ノードとカテゴリ ノードがアダプター サービス参照プラグインの追加ツールにどのように表示されるかについて理解を深めます。

[前提条件]

この手順を開始する前に、「 手順 3: エコー アダプターの接続を実装する」を正常に完了している必要があります。 また、次のクラスも理解する必要があります。

  • Microsoft.ServiceModel.Channels.MetadataRetrievalNode

  • Microsoft.ServiceModel.Channels.MetadataRetrievalNodeDirections

  • Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler

IMetadataBrowseHandler インターフェイス

Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler インターフェイスは次のように定義されます。

public interface IMetadataBrowseHandler : IConnectionHandler, IDisposable  
{  
    MetadataRetrievalNode[] Browse(string nodeId, int childStartIndex, int maxChildNodes, TimeSpan timeout);  
}  

Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler.Browse%2A メソッドは、メソッド パラメーターに基づいてMicrosoft.ServiceModel.Channels.MetadataRetrievalNodeオブジェクトの配列を返します。 次の表では、 Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler.Browse%2A メソッドのパラメーター定義について説明します。

Echo アダプターの実装ではノード ID のみが使用され、エコー アダプターでは少数のノードのみがサポートされるため、他の 3 つのパラメーターは無視されます。

パラメーター 定義
nodeId メタデータ エクスプローラーの階層内の各項目(アダプターサービス参照プラグインの追加)

アダプター サービス アドインは、nodeId を持っています。 各ノード ID は一意である必要があり、カテゴリまたは操作にすることができます。 カテゴリにはサブカテゴリを含めることができます。 手記: null または空の文字列 ("") の場合、操作は既定でルート ノード ("/") から取得されます。
childStartIndex(チャイルドスタートインデックス) 戻される最初の子供のインデックス。

エコー アダプターではサポートされていません。
最大子ノード数 返される結果ノードの最大数。 Int32.Max を使用して、すべての結果ノードを取得します。

エコー アダプターではサポートされていません。
タイムアウト 操作の完了に許容される最大時間。

エコー アダプターではサポートされていません。

Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler.Browse%2A メソッドを実装する場合は、すべてのカテゴリと操作ノードをMicrosoft.ServiceModel.Channels.MetadataRetrievalNodeオブジェクトの配列に追加する必要があります。 ノードをカテゴリとして指定するには、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode.IsOperation%2Afalse に設定します。 ノードを操作として指定するには、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode.IsOperation%2Atrue に設定します。

エコー アダプター メタデータの参照

ターゲット システムのカテゴリと操作に応じて、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトの配列を構築する方法は多数あります。 選択する操作とカテゴリは、公開する操作を表す必要があります。 ただし、Echo アダプターの場合は、ノード ID が一覧表示された次の各ノードの Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成するだけです。

EchoMainCategory  (node under the root node)  
        Echo/EchoStrings   (outbound operation)  
        Echo/EchoGreetings(outbound operation)  
        Echo/EchoCustomGreetingFromFile(outbound operation)  
        Echo/OnReceiveEcho (inbound operation)  

EchoMainCategory は、ルート ノード ("/") の下のカテゴリ ノードです。 このノードは、受信操作と送信操作の両方のカテゴリとしても使用されます。 そのため、そのカテゴリの Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成するときに、次の操作を行うことができます。

MetadataRetrievalNode node = new MetadataRetrievalNode("EchoMainCategory");  
node.IsOperation = false; //category  
node.Direction = MetadataRetrievalNodeDirections.Inbound | MetadataRetrievalNodeDirections.Outbound  //for both inbound and outbound  

EchoMainCategory に属する Echo/EchoString などの送信操作の場合は、次の操作を実行できます。

if( "EchoMainCategory".CompareTo(nodeId) == 0 ) //category is EchoMainCategory  
      {  
          // Outbound operations  
          MetadataRetrievalNode outOpNode1 = new MetadataRetrievalNode("Echo/EchoStrings");  
          outOpNode1.DisplayName = "EchoStrings";  
          outOpNode1.Description = "This operation echoes the incoming string COUNT number of times in a string array.";  
          outOpNode1.Direction = MetadataRetrievalNodeDirections.Outbound;  
          outOpNode1.IsOperation = true;  

EchoMainCategory に属する Echo/OnReceiveEcho などの受信操作では、次の操作を実行できます。

  if( "EchoMainCategory".CompareTo(nodeId) == 0 ) //category is EchoMainCategory  
        {             
// Inbound operations  
            MetadataRetrievalNode inOpNode1 = new MetadataRetrievalNode("Echo/OnReceiveEcho");  
            inOpNode1.DisplayName = "OnReceiveEcho";  
            inOpNode1.Description = "This operation echoes the ___location and length of a file dropped in the specified file system.";  
            inOpNode1.Direction = MetadataRetrievalNodeDirections.Inbound;  
            inOpNode1.IsOperation = true;  

アダプター サービス参照プラグインの追加とアダプター サービスアドインの使用ツールがエコー アダプター メタデータを探索すると、既定ではルート ノード ("/") から開始されます。

次の図は、EchoMainCategory ノードがルート ノード ("/") の下に表示されることを示しています。

EchoMainCategory ノードがルート ノード (

3 つの送信操作を参照するには、[アダプター サービス参照プラグインの追加] ツールの [ コントラクトの種類の選択 ] ドロップダウン リストで、[ クライアント (送信操作)] オプションを選択します。 これらの操作は、次に示すように[ 利用可能なカテゴリと操作 ] リスト ボックスに表示されます。

[使用可能なカテゴリと操作] リスト ボックスを示すスクリーンショット。

前の図では、[使用可能なカテゴリと操作] リスト ボックスの [名前] 列にMicrosoft.ServiceModel.Channels.MetadataRetrievalNode.DisplayName%2A値が表示されていることに注意してください。 Microsoft.ServiceModel.Channels.MetadataRetrievalNodeコンストラクターに渡されたパラメーターは、[使用可能なカテゴリと操作] リスト ボックスの [ノード ID] 列に表示され、Microsoft.ServiceModel.Channels.MetadataRetrievalNode.DisplayName%2Aを右クリックすると、説明を含むツール ヒントとしてMicrosoft.ServiceModel.Channels.MetadataRetrievalNode.Description%2A値が表示されます。

受信操作を表示するには、[アダプター サービス参照プラグインの追加] ツールの [ コントラクトの種類の選択 ] ドロップダウン リストで、[ サービス (受信操作)] オプションを選択します。 次の図に示すように、[ 使用可能なカテゴリと操作 ] リスト ボックスに受信 OnReceiveEcho 操作が表示されます。

**[使用可能なカテゴリと操作] リスト ボックスの受信 OnReceiveEcho 操作を示すスクリーンショット。

IMetadataBrowseHandler の実装

この手順では、EchoAdapterMetadataBrowseHandler クラスを更新して、Echo アダプターのメタデータ参照を実装します。つまり、Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler インターフェイスのMicrosoft.ServiceModel.Channels.Common.IMetadataBrowseHandler.Browse%2A メソッドを実装します。 具体的には、カテゴリと操作ごとに Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成し、そのオブジェクトに適切な値を設定してから、カテゴリと操作の Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトの配列を返します。 Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成するときは、表示名ではなくノード ID を渡す必要があることに注意してください。

EchoAdapterMetadataBrowseHandler クラスを更新するには

  1. ソリューション エクスプローラーで、 EchoAdapterMetadataBrowseHandler.cs ファイルをダブルクリックします。

  2. Visual Studio エディターで、エディター内の任意の場所を右クリックし、コンテキスト メニューで [ アウトライン] をポイントし、[ アウトラインの停止] をクリックします。

  3. Visual Studio エディターの Browse メソッド内で、既存のロジックを次のロジックに置き換えて、EchoMainCategory の Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成します。

    if (MetadataRetrievalNode.Root.NodeId.Equals(nodeId))  
    {  
        MetadataRetrievalNode node = new MetadataRetrievalNode("EchoMainCategory");  
        node.DisplayName = "Main Category";  
        node.IsOperation = false;  
        node.Description = "This category contains inbound and outbound categories.";  
        node.Direction = MetadataRetrievalNodeDirections.Inbound | MetadataRetrievalNodeDirections.Outbound;  
        return new MetadataRetrievalNode[] { node };  
    }  
    
  4. Echo/OnReceiveEcho の Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成するには、次のロジックを引き続き追加します。

    if( "EchoMainCategory".CompareTo(nodeId) == 0 )  
    {  
        // Inbound operations  
        MetadataRetrievalNode inOpNode1 = new MetadataRetrievalNode("Echo/OnReceiveEcho");  
        inOpNode1.DisplayName = "OnReceiveEcho";  
        inOpNode1.Description = "This operation echos the ___location and length of a file dropped in the specified file system.";  
        inOpNode1.Direction = MetadataRetrievalNodeDirections.Inbound;  
        inOpNode1.IsOperation = true;  
    
  5. 次のロジックを追加し続けて、Echo/EchoStrings の Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成します。

    // Outbound operations  
    MetadataRetrievalNode outOpNode1 = new MetadataRetrievalNode("Echo/EchoStrings");  
    outOpNode1.DisplayName = "EchoStrings";  
    outOpNode1.Description = "This operation echoes the incoming string COUNT number of times in a string array.";  
    outOpNode1.Direction = MetadataRetrievalNodeDirections.Outbound;  
    outOpNode1.IsOperation = true;  
    
  6. 次のコードを追加し続けて、Echo/EchoGreetings の Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成します。

    MetadataRetrievalNode outOpNode2 = new MetadataRetrievalNode("Echo/EchoGreetings");  
    outOpNode2.DisplayName = "EchoGreetings";  
    outOpNode2.Description = "This operation echoes the incoming Greeting object COUNT number of times in an array of type Greeting.";  
    outOpNode2.Direction = MetadataRetrievalNodeDirections.Outbound;  
    outOpNode2.IsOperation = true;  
    
  7. 次のコードを追加し続けて、Echo/EchoGreetingFromFile の Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成します。

    MetadataRetrievalNode outOpNode3 = new MetadataRetrievalNode("Echo/EchoCustomGreetingFromFile");  
    outOpNode3.DisplayName = "EchoCustomGreetingFromFile";  
    outOpNode3.Description = "This operation echoes the greeting object by reading its instance from a file. The Greeting object's metadata is obtained from a predefined XSD file.";  
    outOpNode3.Direction = MetadataRetrievalNodeDirections.Outbound;  
    outOpNode3.IsOperation = true;  
    
  8. 次のコードを追加し続けて、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトの配列を返します。一致しない場合は null を返します。

        return new MetadataRetrievalNode[] { inOpNode1, outOpNode1, outOpNode2, outOpNode3 };  
    }  
    return null;  
    
  9. Visual Studio の [ ファイル ] メニューの [ すべて保存] をクリックします。

  10. [ビルド] メニューの [ソリューションのビルド] をクリックします。 プロジェクトを正常にビルドするべきです。 そうでない場合は、上記のすべての手順に従っていることを確認します。

作業を保存しました。 この時点で Visual Studio を安全に閉じるか、次の手順「 手順 5: エコー アダプターのメタデータ検索ハンドラーを実装する」に進むことができます。

私は何をしましたか?

Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler インターフェイスの Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler.Browse%2A メソッドを実装することで、Echo アダプターのメタデータ参照機能を実装しました。 具体的には、カテゴリの Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成し、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトの配列として返しました。 操作ごとに、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成し、 Microsoft.ServiceModel.Channels.MetadataRetrievalNodeの配列内のすべてのオブジェクトを返しました。

次のステップ

メタデータの検索と解決機能、および送信メッセージ交換を実装します。 最後に、エコー アダプターをビルドして展開します。

こちらもご覧ください

チュートリアル 1: エコー アダプターを開発する
手順 3: エコー アダプターの接続を実装する
手順 5: エコー アダプターのメタデータ検索ハンドラーを実装する