次の方法で共有


手順 5: エコー アダプターのメタデータ検索ハンドラーを実装する

手順 5/9

完了までの時間: 30 分

チュートリアルのこの手順では、エコー アダプターの検索機能を実装します。 閲覧とは異なり、検索はオプションの機能です。 WCF LOB アダプター SDK によると、検索機能をサポートするには、 Microsoft.ServiceModel.Channels.Common.IMetadataSearchHandler インターフェイスを実装する必要があります。 エコー アダプターの場合、アダプター開発ウィザードは、EchoAdapterMetadataSearchHandler という 1 つの派生クラスを自動的に生成します。

最初に EchoAdapterMetadataSearchHandler クラスを更新して、このインターフェイスを実装する方法、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを設定する方法、およびアダプター サービス参照プラグインの追加ツールで検索結果がどのように表示されるかについて理解を深めます。

[前提条件]

この手順を開始する前に、「 手順 4: エコー アダプターのメタデータ参照ハンドラーを実装する」を完了します。 また、次のクラスについて明確に理解しておく必要があります。

  • Microsoft.ServiceModel.Channels.MetadataRetrievalNode

  • Microsoft.ServiceModel.Channels.Common.IMetadataSearchHandler

  • Microsoft.ServiceModel.Channels.MetadataRetrievalNodeDirections

IMetadataSearchHandler インターフェイス

Microsoft.ServiceModel.Channels.Common.IMetadataSearchHandler は次のように定義されます。

public interface IMetadataSearchHandler : IConnectionHandler, IDisposable  
{  
    MetadataRetrievalNode[] Search(string nodeId, string searchCriteria, int maxChildNodes, TimeSpan timeout);  
}  

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

パラメーター 定義
nodeId 検索を開始するノード ID。 null または空の文字列 ("") の場合、操作はルート ノード ("/") から取得されます。
検索条件 アダプター固有の検索条件。 検索条件が指定されていない場合、アダプターはすべてのノードを返す必要があります。
最大子ノード数 返される結果ノードの最大数。 Int32.Max を使用して、すべての結果ノードを取得します。

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

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

検索結果の場合、アダプターはカテゴリ ノードまたは操作ノード、またはその両方を返すように選択できます。 アダプターがサポートする検索機能の種類に対応します。

ターゲット システムのカテゴリと操作に応じて、返される Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトの配列を構築する方法は多数あります。 Echo アダプターが検索機能を実装する方法は、次の一覧のノード ID を使用してすべての操作を実行することです。

Echo/OnReceiveEcho, inbound operation  
Echo/EchoStrings, outbound operation  
Echo/EchoGreetings, outbound operation  
Echo/EchoGreetingFromFile, outbound operation  
  • ノード ID が検索条件と一致する場合は、操作のノード ID を使用して Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成し、プロパティに値を割り当てます。 たとえば、

    MetadataRetrievalNode nodeInbound = new MetadataRetrievalNode("Echo/OnReceiveEcho"); //create the MetadataRetrievalNode using the operation's node ID.  
    nodeInbound.DisplayName = "OnReceiveEcho"; //The Display Name shown in the Name column of the Add Adapter Service Reference Visual Studio Plug-in  
    nodeInbound.Description = "This operation echoes the ___location and length of a file dropped in the specified file system.";  //The Description shown as the tool tip in the Add Adapter Service Visual Studio Plug-in  
    nodeInbound.Direction = MetadataRetrievalNodeDirections.Inbound;    //It is an inbound operation  
    nodeInbound.IsOperation = true;  //It is an operation, not category.  
    
  • 次に、 Microsoft.ServiceModel.Channels.MetadataRetrievalNodeのコレクションにオブジェクトを追加します。たとえば、

    resultList.Add(nodeInbound);  
    
  • 最後に配列形式でコレクションを返します。

    return resultList.ToArray();  
    

    アダプター サービス リファレンス プラグインの追加とアダプター サービス アドインツールを使用して、利用可能な操作を接続ベースで検索することができます。 たとえば、次の図は、検索条件が文字列 Greeting の場合、 検索で EchoGreetings および EchoGreetingFromFile 操作が返されることを示しています。

    [アダプター サービス参照の追加] ダイアログ ボックスを示すスクリーンショット。

    一致するものが見つからない場合、いずれかのツールは次の図に示すエラー メッセージを返します。

    一致するものが見つからない場合に返されるエラーを示すスクリーンショット。

IMetadataSearchHandler の実装

Microsoft.ServiceModel.Channels.Common.IMetadataSearchHandler インターフェイスのMicrosoft.ServiceModel.Channels.Common.IMetadataSearchHandler.Search%2A メソッドを実装します。 操作の表示名が検索条件と一致する場合は、その操作の Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成し、そのオブジェクトを Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトの配列に追加します。

EchoAdapterMetadataSearchHandler クラスを更新するには

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

  2. Visual Studio エディターの Search メソッド内で、既存のロジックを次のように置き換えます。 このロジックは、Echo/OnReceiveEcho が指定した検索条件と一致する場合に、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成します。

    List<MetadataRetrievalNode> resultList = new List<MetadataRetrievalNode>();  
    if ("OnReceiveEcho".ToLower().Contains(searchCriteria.ToLower()))  
    {  
        MetadataRetrievalNode nodeInbound = new MetadataRetrievalNode("Echo/OnReceiveEcho");  
        nodeInbound.DisplayName = "OnReceiveEcho";  
        nodeInbound.Description = "This operation echoes the ___location and length of a file dropped in the specified file system.";  
        nodeInbound.Direction = MetadataRetrievalNodeDirections.Inbound;  
        nodeInbound.IsOperation = true;  
        resultList.Add(nodeInbound);  
    }  
    
  3. Echo/EchoStrings が指定した検索条件と一致する場合は、次のロジックを追加して Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成します。

    if ("EchoStrings".ToLower().Contains(searchCriteria.ToLower()))  
    {  
        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;  
        resultList.Add(outOpNode1);  
    }  
    
  4. Echo/EchoGreetings が指定した検索条件と一致する場合は、次のロジックを追加して Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成します。

    if ("EchoGreetings".ToLower().Contains(searchCriteria.ToLower()))  
        {  
            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;  
            resultList.Add(outOpNode2);  
        }  
    
  5. Echo/EchoGreetingFromFile が指定した検索条件と一致する場合は、次のコードを追加して Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成します。

    if ("EchoCustomGreetingFromFile".ToLower().Contains(searchCriteria.ToLower()))  
    {  
        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;  
        resultList.Add(outOpNode3);  
    }  
    
  6. 次のコードを追加し続けて、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトの配列を返します。

    return resultList.ToArray();  
    
  7. Visual Studio の [ ファイル ] メニューの [ すべて保存] をクリックします。

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

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

私は何をしましたか?

Microsoft.ServiceModel.Channels.Common.IMetadataSearchHandler インターフェイスの Microsoft.ServiceModel.Channels.Common.IMetadataSearchHandler.Search%2A メソッドを実装することで、Echo アダプターのメタデータ検索機能を実装しました。 具体的には、条件に一致するすべての操作に対して Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトを作成し、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode オブジェクトの配列を返しました。

次のステップ

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

こちらもご覧ください

手順 4: エコー アダプターのメタデータ参照ハンドラーを実装する
手順 6: エコー アダプターのメタデータ解決ハンドラーを実装する
チュートリアル 1: エコー アダプターを開発する