完成时间: 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 适配器不支持。 |
超时 | 完成操作所允许的最长时间。 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
。
Echo 适配器元数据浏览
根据目标系统的类别和操作,有多种方法可以生成一个对象数组 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.DisplayName%2A
时,Microsoft.ServiceModel.Channels.MetadataRetrievalNode.Description%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
接口的 Microsoft.ServiceModel.Channels.Common.IMetadataBrowseHandler.Browse%2A
方法,刚刚实现了 Echo 适配器的元数据浏览功能。 具体而言,你为类别创建了一个 Microsoft.ServiceModel.Channels.MetadataRetrievalNode
对象,然后将其作为对象的数组 Microsoft.ServiceModel.Channels.MetadataRetrievalNode
返回。 对于每个操作,您创建了一个 Microsoft.ServiceModel.Channels.MetadataRetrievalNode
对象,然后将这些对象全部返回到一个 Microsoft.ServiceModel.Channels.MetadataRetrievalNode
类型的数组中。
后续步骤
你实施元数据搜索与解析功能,以及出站消息的交换。 最后,生成并部署 Echo 适配器。
另请参阅
教程 1:开发 Echo 适配器
步骤 3:实现 Echo 适配器的连接
步骤 5:实现 Echo 适配器的元数据搜索处理程序