完了までの時間: 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%2A
を false
に設定します。 ノードを操作として指定するには、 Microsoft.ServiceModel.Channels.MetadataRetrievalNode.IsOperation%2A
を true
に設定します。
エコー アダプター メタデータの参照
ターゲット システムのカテゴリと操作に応じて、 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 ノードがルート ノード ("/") の下に表示されることを示しています。
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 操作が表示されます。
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 クラスを更新するには
ソリューション エクスプローラーで、 EchoAdapterMetadataBrowseHandler.cs ファイルをダブルクリックします。
Visual Studio エディターで、エディター内の任意の場所を右クリックし、コンテキスト メニューで [ アウトライン] をポイントし、[ アウトラインの停止] をクリックします。
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 }; }
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;
次のロジックを追加し続けて、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;
次のコードを追加し続けて、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;
次のコードを追加し続けて、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;
次のコードを追加し続けて、
Microsoft.ServiceModel.Channels.MetadataRetrievalNode
オブジェクトの配列を返します。一致しない場合は null を返します。return new MetadataRetrievalNode[] { inOpNode1, outOpNode1, outOpNode2, outOpNode3 }; } return null;
Visual Studio の [ ファイル ] メニューの [ すべて保存] をクリックします。
[ビルド] メニューの [ソリューションのビルド] をクリックします。 プロジェクトを正常にビルドするべきです。 そうでない場合は、上記のすべての手順に従っていることを確認します。
注
作業を保存しました。 この時点で 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: エコー アダプターのメタデータ検索ハンドラーを実装する