WCF LOB アダプター SDK を使用してメタデータを参照および検索する
このセクションでは、それぞれ IMetadataBrowseHandler と IMetadataSearchHandler を実装して、アダプターで参照と検索機能を公開する方法について説明します。
IMetadataBrowseHandler
プロジェクトにアダプターを追加する場合、IMetadataBrowseHandler を使用すると、アダプターがサポートするカテゴリと操作を参照できます。 これにより、アダプター コンシューマーは、デザイン時にメタデータ情報を表示し、クライアント プロセスで必要な操作のみを選択できます。
アダプター サービス参照の追加 Visual Studio プラグインまたはアダプター サービス BizTalk プロジェクト アドインを使用してアダプターをプロジェクトに追加すると、IMetadataBrowseHandler によって [Select contract type]\(コントラクトの種類の選択\)、[ Select a Category]\(カテゴリの選択\)、[Available categories and operations]\( 使用可能なカテゴリと操作 \) ボックスが設定されます。
を参照する
次の例では、IMetadataBrowseHandler を実装する方法を示します。 アダプターがサポートするカテゴリと操作に関する情報を含む MetadataRetrievalNode 配列を構築します。
public class EchoAdapterMetadataBrowseHandler : EchoAdapterHandlerBase, IMetadataBrowseHandler
{
/// <summary>
/// Initializes a new instance of the EchoAdapterMetadataBrowseHandler class
/// </summary>
public EchoAdapterMetadataBrowseHandler(EchoAdapterConnection connection
, MetadataLookup metadataLookup)
: base(connection, metadataLookup)
{
}
#region IMetadataBrowseHandler Members
/// <summary>
/// Retrieves an array of MetadataRetrievalNodes from the target system.
/// The browse operation will return nodes starting from the childStartIndex in the path provided in absoluteName, and the number of nodes returned is limited by maxChildNodes.
/// The method should complete within the specified timespan or throw a timeout exception.
/// If absoluteName is null or an empty string, return nodes starting from the root + childStartIndex.
/// If childStartIndex is zero, then return starting at the node indicated by absoluteName (or the root node if absoluteName is null or empty).
/// </summary>
public MetadataRetrievalNode[] Browse(string nodeId
, int childStartIndex
, int maxChildNodes, TimeSpan timeout)
{
// note we don't support timeout in this sample
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 };
}
else if( "EchoMainCategory".CompareTo(nodeId) == 0 )
{
// 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;
// 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;
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;
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;
return new MetadataRetrievalNode[] { inOpNode1, outOpNode1, outOpNode2, outOpNode3 };
}
return null;
}
#endregion IMetadataBrowseHandler Members
}
IMetadataSearchHandler
アダプター内に IMetadataSearchHandler を実装すると、操作名の一部などの検索用語を入力して、デザイン時に使用可能な操作を検索できます。 これは、検索値を入力して返される操作を制限できるため、アダプターに多数の操作が含まれている場合に非常に便利です。
[アダプター サービス参照の追加] Visual Studio プラグインまたはアダプター サービス BizTalk プロジェクト アドインを使用してアダプターをプロジェクトに追加する場合、IMetadataSearchHandler は [ カテゴリ内の検索 ] ボックスに入力された検索文字列を解決し、[ 利用可能なカテゴリと操作 ] ボックスに一致する項目の一覧を返します。
また、検索値を op=value の形式でクエリ文字列として渡すことで、アダプターの WSDL またはプロキシを生成するときに、svcutil.exe を使用して検索を実行することもできます。 次に、svcutil.exe を使用して Echo/EchoStrings 操作情報のみを返す例を示します。
svcutil.exe “echov2://lobhostname/lobapplication?enableAuthentication=False&op=Echo/EchoStrings” /target:metadata
Note
WCF LOB アダプター SDK には、Echo* や %Echo% などの既定のワイルドカード検索機能は用意されていません。 ワイルドカードまたはパターン マッチング機能を実装するのは、アダプターの作成者次第です。
次の例では、IMetadataSearchHandler を実装する方法を示します。 アダプターがサポートするカテゴリと操作に関する情報を含む MetadataRetrievalNode 配列を構築します。
public class EchoAdapterMetadataSearchHandler : EchoAdapterHandlerBase, IMetadataSearchHandler
{
/// <summary>
/// Initializes a new instance of the EchoAdapterMetadataSearchHandler class
/// </summary>
public EchoAdapterMetadataSearchHandler(EchoAdapterConnection connection
, MetadataLookup metadataLookup)
: base(connection, metadataLookup)
{
}
#region IMetadataSearchHandler Members
/// <summary>
/// Retrieves an array of MetadataRetrievalNodes (see Microsoft.ServiceModel.Channels) from the target system.
/// The search will begin at the path provided in absoluteName, which points to a location in the tree of metadata nodes.
/// The contents of the array are filtered by SearchCriteria and the number of nodes returned is limited by maxChildNodes.
/// The method should complete within the specified timespan or throw a timeout exception. If absoluteName is null or an empty string, return nodes starting from the root.
/// If SearchCriteria is null or an empty string, return all nodes.
/// </summary>
public MetadataRetrievalNode[] Search(string nodeId
, string searchCriteria
, int maxChildNodes, TimeSpan timeout)
{
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 echos the location and length of a file dropped in the specified file system.";
nodeInbound.Direction = MetadataRetrievalNodeDirections.Inbound;
nodeInbound.IsOperation = true;
resultList.Add(nodeInbound);
}
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);
}
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);
}
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);
}
return resultList.ToArray();
}
#endregion IMetadataSearchHandler Members
}