演练:使用 XML 信封(基本)

本示例通过实现部分虚构的错误跟踪系统来演示基本的 XML 信封拆装。 该示例要满足以下条件:

  1. 错误消息记录在公司内部不同的物理地点,并发送到一个中央位置,供各种后端系统进行处理。

  2. 错误信息以 XML 格式编写。

  3. 可不用信封就将错误消息发送出去,也可以包含在一个信封中,成批发送出去。

必备条件

对于本示例,您需要熟悉以下操作:创建 BizTalk 项目、签署程序集、使用 BizTalk Server 管理控制台查看应用程序和端口。 还应熟悉 演练:部署基本 BizTalk 应用程序中提供的想法。

此示例的作用

该示例通过定义一个信封架构并使用 XmlDisassembler 管道来处理包含单个错误消息或一批错误消息的入站消息。

示例

若要创建该示例,请按照下述步骤进行操作。

创建新 BizTalk 项目

生成解决方案前,需要先创建一个 BizTalk 项目,确保要对其进行强命名,并为其指定一个应用程序名。 指定应用程序名可防止 BizTalk Server 将该解决方案部署到默认 BizTalk 应用程序中。

创建并配置新的 BizTalk 项目
  1. 使用 Visual Studio 创建新的 BizTalk 项目。 调用项目 BasicXMLEnvelope

  2. 生成密钥文件,并将其分配给该项目。 有关此任务的详细信息,请参阅 如何配置强名称程序集密钥文件

  3. 在项目的部署配置属性中,分配 应用程序名称 并将 “重启主机实例” 设置为 True。 设置此标志的作用是通知主机清除该程序集的所有缓存的实例。

创建错误架构

在此步骤中,您将创建 Error(错误)架构。 该架构定义系统的重要消息。

创建错误架构
  1. 向项目中添加名称为“Error”的新架构。

  2. 将架构的目标命名空间更改为 http://BasicXMLEnvelope

  3. “高级”类别下的架构属性 Element FormDefault 更改为“限定”。 这指明本地声明的元素必须受到实例文档中的目标命名空间的限定。

  4. 重命名根节点“Error”,并创建 5 个子元素,类型如下:

    • ID,xs:int

    • Type,xs:int

    • Priority,xs:string

    • 说明,xs:string

    • ErrorDateTime,xs:string

      您所创建的架构应基本如下:

      已完成错误架构

  5. 为此架构创建一个示例消息。 此消息用于检验对信封外的单个消息的处理是否正确。 下面是一个示例消息:

    <Error xmlns="http://BasicXMLEnvelope">  
      <ID>1</ID>  
      <Type>5</Type>  
      <Priority>Low</Priority>  
      <Description>Sprocket widget prints reports slowly.</Description>  
      <ErrorDateTime>1999-05-31T13:20:00.000-05:00</ErrorDateTime>  
    </Error>  
    

    将此消息保存到项目目录下的文件中。

创建信封架构

该信封包含一个或多个错误消息。 在本基本示例中,信封没有自己的属性和元素。

创建信封架构
  1. 向项目 BasicXMLEnvelope 添加名称为“Envelope”的新架构。

  2. 将目标命名空间更改为 http://BasicXMLEnvelope

  3. 将根节点的名称从“Root”改为“Envelope”。

  4. 现在,将该架构标记为信封架构。 单击 <“架构”> 节点。 在“属性”窗格中,将架构引用属性 Envelope 设置为 OK

  5. 设置 Body XPath 属性。 为此,请单击“ 信封” 节点。 在属性窗口,单击“正文 XPath”属性中的省略号 (...) 按钮,选择“信封”,然后单击“确定”。

  6. 向“Envelope”节点任意添加一个“任何元素”子级。 错误信息将包含在此元素中。 您所创建的架构应基本如下:

    已完成的信封架构

  7. 创建一个包含一个信封、一个或多个示例消息的示例消息。 示例消息为:

    <Envelope xmlns="http://BasicXMLEnvelope">  
      <Error>  
        <ID>102</ID>  
        <Type>0</Type>  
        <Priority>High</Priority>  
        <Description>Sprocket query fails.</Description>  
        <ErrorDateTime>1999-05-31T13:20:00.000-05:00</ErrorDateTime>  
      </Error>  
      <Error>  
        <ID>16502</ID>  
        <Type>2</Type>  
        <Priority>Low</Priority>  
        <Description>Time threshold exceeded.</Description>  
        <ErrorDateTime>1999-05-31T13:20:00.000-05:00</ErrorDateTime>  
      </Error>  
    </Envelope>  
    

    将此消息保存到项目目录下的文件中。

部署和配置发送和接收端口

创建架构后,还需要编译和部署项目。 部署完毕后,就可使用 BizTalk Server 管理控制台来配置发送端口和接收端口。

部署 BasicXMLEnvelope
  1. 在 Visual Studio 中,从“生成”菜单中选择“ 部署 BasicXMLEnvelope ”。 这将生成“BasicXMLEnvelope”并将其作为应用程序部署到 BizTalk Server。

  2. 在BizTalk Server管理控制台中,展开“应用程序”组,验证 BasicXMLEnvelope 是否作为自定义应用程序存在。

配置接收端口
  1. 使用 Windows 资源管理器在 BasicXMLEnvelope 项目目录下创建名为“Receive”的目录。

  2. 在BizTalk Server管理控制台中,展开 BasicXMLEnvelope 应用程序,右键单击“接收端口”,指向“新建”,然后单击“单向接收端口”。

  3. 在“ 接收端口属性 ”对话框中,将端口的名称设置为“Receive”。

  4. 右键单击“接收位置”,然后单击“ 新建 ”添加接收端口。 将新端口命名为“ReceiveError”。 将 接收管道 设置为 XMLReceive。 对于 “传输类型”,选择“ 文件”,然后单击“ 配置”。

  5. 选择上面创建的接收目录,然后单击“ 确定”。 现在接收端口配置完毕。 单击“确定”关闭。

配置发送端口
  1. 使用 Windows 资源管理器在 BasicXMLEnvelope 项目目录下创建名为“Send”的目录。

  2. 在BizTalk Server管理控制台中,展开“BasicXMLEnvelope”应用程序,右键单击“发送端口”,指向“新建”,然后单击“静态单向”。

  3. 在“ 发送端口属性 ”对话框中,将端口的名称设置为“Send”。

  4. 对于 “传输类型”,选择“ 文件”,然后单击“ 配置”。 将目标文件夹设置为之前创建的发送目录,然后单击“ 确定”。

  5. 单击“ 筛选器 ”并添加单个筛选器:

    • Bts。MessageType == http://BasicXMLEnvelope#Error
  6. 单击“ 确定 ”完成发送端口配置。 现在发送端口配置完毕。

运行示例

现在该运行示例了。 使用 BizTalk Server 管理控制台启动 BasicXMLEnvelope 应用程序后,您应将测试文件复制到接收位置,然后观察发送位置生成的内容。

运行 BasicXMLEnvelope 示例
  1. 在BizTalk Server管理控制台中,右键单击 BasicXMLEnvelope 应用程序,然后单击“启动”。 此时将登记并启动发送端口和接收端口。

  2. 将所有示例文件放入接收目录中。 如果您使用前面给出的示例,则操作完毕时,应在发送位置找到三个单个错误消息。

扩展示例

您可扩展该示例以满足其他要求。 此处主要介绍两种常见方案:

  • 如果一批错误是装入信封中提交的,则单个消息的拆装错误不应阻止其他无错误消息的进一步处理。

  • 应根据错误优先级,将错误发送到不同位置。 高优先级的消息应迅速处理,而其他优先级的消息应按照常规方式进行处理。

    以下部分扩展了该示例,以处理这些要求。

可恢复的交换处理

BizTalk Server支持可恢复的交换处理。 借助此功能,您可确保成批消息的拆装中只会单个消息失败,而不会整批单位。

配置可恢复交换处理的示例
  1. 在BizTalk Server管理控制台中,展开 BasicXMLEnvelope 应用程序,单击“接收端口”,然后双击“接收端口”。 它是您先前创建的端口。

  2. 在“ 接收端口属性 ”对话框中,单击“ 接收位置”。 单击 “属性” 以显示“ ReceiveError 接收位置属性 ”对话框。 单击接收管道的省略号 (...) 按钮。

  3. “配置管道 - XMLReceive ”对话框中,将“ 可恢复的交换处理 ”属性设置为 True,然后单击“ 确定”。

  4. 单击 “确定 ”关闭“ 接收位置属性 ”对话框,然后单击“ 确定 ”关闭“ 接收端口属性 ”对话框。

创建示例文件并运行示例
  1. 若要创建示例文件,请复制在示例中创建的信封示例文件,并向其中一个“Error”实例添加一个并不存在的命名空间,然后保存该文件:

    <Envelope xmlns="http://BasicXMLEnvelope">  
      <Error>  
        <ID>102</ID>  
        <Type>0</Type>  
        <Priority>High</Priority>  
        <Description>Sprocket query fails to return any sprockets even though some exist</Description>  
        <ErrorDateTime>1999-05-31T13:20:00.000-05:00</ErrorDateTime>  
      </Error>  
      <Error xmlns="http://ThisIsAnError">  
        <ID>16502</ID>  
        <Type>2</Type>  
        <Priority>Low</Priority>  
        <Description>Time threshold exceeded.</Description>  
        <ErrorDateTime>1999-05-31T13:20:00.000-05:00</ErrorDateTime>  
      </Error>  
    </Envelope>  
    
  2. 在BizTalk Server管理控制台中,单击“应用程序”并验证 BasicXMLEnvelope 应用程序是否正在运行。

  3. 将该消息放入接收位置。 操作完毕后,您应在发送位置找到第一条消息,并在挂起队列中找到优先级较低的第二条消息。

基于内容的路由 (CBR)

借助基于内容的路由,您可根据消息的内容来路由消息。 在本方案中,路由是基于优先级进行的,高优先级的消息路由到一个发送位置,低优先级和中优先级的消息路由到另一个发送位置。

若要扩展该示例,必须完成以下任务:

  1. 提升 BasicXMLEnvelope 项目中错误架构中的 “优先级” 字段。 基于内容的路由依靠升级的属性来路由消息。 有关详细信息,请参阅 提升属性

  2. 创建并配置其他两个发送端口。 这些端口使用筛选器来确保其接收正确的消息。

提升错误架构中的“优先级”字段
  1. 在 Visual Studio 中打开 BasicXMLEnvelope 项目后,打开 “错误” 架构并展开 “错误” 节点。

  2. 右键单击 Priority 元素,指向 “提升”,然后单击“ 快速升级”。

  3. 单击“ 确定 ”,确认是否为升级的属性添加了新的属性架构。

  4. 在 Visual Studio 解决方案资源管理器 中,打开新的属性架构 PropertySchema.xsd。 从架构中删除“Field1”。

  5. 现在重新编译并重新部署该解决方案。 在“生成”菜单中,选择“部署 BasicXMLEnvelope”。

  6. 该项目原本配置为在重新部署解决方案时,重置主机实例。 如果您对此进行了更改,则需要停止并重新启动主机。

配置低优先级和中优先级发送端口
  1. 使用 Windows 资源管理器在 BasicXMLEnvelope 项目目录下创建名为“SendLowMediumPriority”的目录。

  2. 在BizTalk Server管理控制台中,展开 BasicXMLEnvelope 应用程序,右键单击“发送端口”,指向“新建”,然后单击“静态单向”。

  3. 在“ 发送端口属性 ”对话框中,将端口的名称设置为“SendLowMediumPriority”。

  4. 对于“ 传输类型”,选择“ 文件”,然后单击“ 配置”。 将目标文件夹设置为前面创建的目录。 单击“确定”关闭。

  5. 单击“ 筛选器 ”并添加三个筛选表达式:

    • Bts。MessageType == http://BasicXMLEnvelope#Error And

    • BasicXMLEnvelope.PropertySchema.Priority == Low Or

    • BasicXMLEnvelope.PropertySchema.Priority == Medium

  6. 单击“ 确定 ”完成低优先级和中优先级发送端口配置。

配置高优先级发送端口
  1. 使用 Windows 资源管理器在 BasicXMLEnvelope 项目目录下创建名为“SendHighPriority”的目录。

  2. 在BizTalk Server管理控制台中,展开 BasicXMLEnvelope 应用程序,右键单击“发送端口”,指向“新建”,然后单击“静态单向”。

  3. 在“ 发送端口属性 ”对话框中,将端口的名称设置为“SendHighPriority”。

  4. 对于“ 传输类型”,选择“ 文件”,然后单击“ 配置”。 将目标文件夹设置为前面创建的目录。 单击“确定”关闭。

  5. 单击“ 筛选器 ”并添加两个筛选表达式:

    • Bts。MessageType == http://BasicXMLEnvelope#Error And

    • BasicXMLEnvelope.PropertySchema.Priority == High

  6. 单击“ 确定 ”完成高优先级发送端口配置。

测试路由解决方案
  1. 在BizTalk Server管理控制台中,展开“应用程序”组,右键单击“BasicXMLEnvelope”应用程序,然后单击“启动”。 当系统提示确认时,单击“ 启动”。 这将登记新发送端口。

  2. 将测试消息放入接收位置。 请注意错误消息是如何被路由到不同的发送位置的:

    • 错误消息,不论其优先级是高、中还是低,只要消息处理没有失败,都会路由到两个位置:原始发送位置(在核心示例中配置)和相应优先级的发送位置。 对于低优先级和中优先级的消息,原始发送位置和低/中优先级发送位置均会出现该消息。

    • 如果启用了可恢复的交换处理,则不会路由失败的错误消息,而没有失败的消息将按预期正确路由。 不路由失败消息的原因是,其消息类型与所配置的筛选器的类型不匹配。

另请参阅

可恢复的交换处理
升级属性
CBRSample(BizTalk Server 示例)