步骤 4:实现 Echo 适配器的元数据浏览处理程序
完成时间: 45 分钟
在此步骤中,你将实现 Echo 适配器的浏览功能。 此功能允许适配器执行基于连接的浏览,以从目标系统获取元数据。 无论适配器的功能如何,适配器都必须支持浏览功能。
根据 WCF LOB 适配器 SDK,若要支持浏览功能,必须实现 Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler
接口。 对于 Echo 适配器,适配器开发向导会自动生成名为 EchoAdapterMetadataBrowseHandler 的派生类。
在以下步骤中,请更新此类,以便更好地了解如何实现 Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler.Browse%2A
方法、如何设置对象的各种属性 Microsoft.ServiceModel.Channels.MetadataRetrievalNode
,以及适配器支持的操作和类别节点如何显示在“添加适配器服务引用插件”工具中。
必备条件
在开始此步骤之前,必须已成功完成 步骤 3:实现 Echo 适配器的连接。 还必须了解以下类:
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 并忽略其他三个参数,因为 Echo 适配器仅支持几个节点。
参数 | 定义 |
---|---|
nodeId | 元数据资源管理器层次结构中的每个项 (添加适配器服务引用插件和 使用适配器服务外接程序) 具有 nodeId。 每个节点 ID 必须唯一,可以是类别或操作。 该类别可以具有子类别。 注意: 如果 null 或空字符串 (“”) ,则默认从根节点 (“/”) 检索操作。 |
childStartIndex | 要返回的第一个子级的索引。 Echo 适配器不支持。 |
maxChildNodes | 要返回的结果节点的最大数目。 使用 Int32.Max 检索所有结果节点。 Echo 适配器不支持。 |
timeout | 允许操作完成的最长时间。 Echo 适配器不支持。 |
实现 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 适配器,它只是为以下每个节点创建一个 Microsoft.ServiceModel.Channels.MetadataRetrievalNode
对象,其中列出了节点 ID:
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;
当添加适配器服务引用插件和使用适配器服务加载项工具浏览 Echo 适配器元数据时,默认情况下,它从根节点 (“/”) 启动。
下图显示了 EchoMainCategory 节点显示在根节点 (“/”) 下:
若要浏览这三个出站操作,请在“添加适配器服务引用插件”工具的 “选择协定类型” 下拉列表中,选择“ 客户端 (出站操作) 选项。 可以在 “可用类别和操作 ”列表框中看到这些操作,如下所示:
在上图中,请注意,Microsoft.ServiceModel.Channels.MetadataRetrievalNode.DisplayName%2A
该值显示在“可用类别和操作”列表框的“名称”列中。 传递到Microsoft.ServiceModel.Channels.MetadataRetrievalNode
构造函数的参数显示在“可用类别和操作”列表框的“节点 ID”列中,Microsoft.ServiceModel.Channels.MetadataRetrievalNode.Description%2A
当右键单击 Microsoft.ServiceModel.Channels.MetadataRetrievalNode.DisplayName%2A
时,该值显示为包含说明的工具提示。
若要查看入站操作,请在“添加适配器服务引用插件”工具的 “选择协定类型” 下拉列表中,选择“ 服务 (入站操作) 选项。 可在 “可用类别和操作 ”列表框中看到入站 OnReceiveEcho 操作,如下图所示:
实现 IMetadataBrowseHandler
在此步骤中,将更新 EchoAdapterMetadataBrowseHandler 类以实现 Echo 适配器的元数据浏览,即实现 Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler.Browse%2A
接口的 Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler
方法。 具体而言,为每个类别和操作创建一个 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:实现 Echo 适配器的元数据搜索处理程序。
我刚才做了些什么?
你刚刚通过实现 Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler.Browse%2A
接口的 方法实现了 Echo 适配器的 Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler
元数据浏览功能。 具体而言,你为类别创建了一个 Microsoft.ServiceModel.Channels.MetadataRetrievalNode
对象,然后将其作为对象的数组 Microsoft.ServiceModel.Channels.MetadataRetrievalNode
返回。 对于每个操作,你都创建了一个 Microsoft.ServiceModel.Channels.MetadataRetrievalNode
对象,然后返回 数组中的所有 Microsoft.ServiceModel.Channels.MetadataRetrievalNode
对象。
后续步骤
实现元数据搜索和解析功能以及出站消息交换。 最后,生成并部署 Echo 适配器。
另请参阅
教程 1:开发 Echo 适配器
步骤 3:实现 Echo 适配器的连接
步骤 5:实现 Echo 适配器的元数据搜索处理程序
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈