步骤 4:实现 Echo 适配器的元数据浏览处理程序

步骤 4/9

完成时间: 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 节点显示在根节点 (“/”) 下:

显示 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 操作,如下图所示:

显示“可用类别和操作”列表框中的入站 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 类

  1. 在解决方案资源管理器中,双击 EchoAdapterMetadataBrowseHandler.cs 文件。

  2. 在 Visual Studio 编辑器中,右键单击编辑器中的任意位置,在上下文菜单中,指向“大纲”,然后单击“停止大纲”。

  3. 在 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 };  
    }  
    
  4. 继续添加以下逻辑,为 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;  
    
  5. 继续添加以下逻辑,为 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;  
    
  6. 继续添加以下代码,为 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;  
    
  7. 继续添加以下代码,为 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;  
    
  8. 继续添加以下代码以返回对象的数组 Microsoft.ServiceModel.Channels.MetadataRetrievalNode ;如果未匹配,则返回 null。

        return new MetadataRetrievalNode[] { inOpNode1, outOpNode1, outOpNode2, outOpNode3 };  
    }  
    return null;  
    
  9. 在 Visual Studio 的“ 文件 ”菜单上,单击“ 全部保存”。

  10. 在“生成”菜单中,单击“生成解决方案”。 应成功生成项目。 如果没有,请确保已执行上述每个步骤。

注意

保存所做的工作。 此时可以安全地关闭 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 适配器的元数据搜索处理程序