草庐IT

关于xml:BizTalk信封架构自闭合节点

codeneng 2023-03-28 原文

BizTalk envelope schema self-closing node

我创建了一个 BizTalk 接收位置,它有一个订阅发送端口,该端口接受封装的消息并仅使用 XML 接收管道拆分成单独的消息。

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<MyEnvelope xmlns="MyNameSpace">
    <MyData>ABC</MyData>
    <MyData>DEF</MyData>
    <MyData>GHI</MyData>
</MyEnvelope>

保存为

1
2
<?xml version="1.0" encoding="utf-8"?>
<MyData xmlns="MyNameSpace">ABC</MyData>

,

1
2
 <?xml version="1.0" encoding="utf-8"?>
 <MyData xmlns="MyNameSpace">DEF</MyData>

1
2
 <?xml version="1.0" encoding="utf-8"?>
 <MyData xmlns="MyNameSpace">GHI</MyData>

太棒了。

但是,当消息中没有元素时,服务会发送带有自动关闭和空信封的消息:

1
2
<?xml version="1.0" encoding="utf-8"?>
<MyEnvelope xmlns="MyNameSpace"/>

我收到错误消息

Source:"XML disassembler" Receive Port:"InLocation" URI:
"c:\\MyLocation*.xml" Reason: Unexpected event ("eos") in state
"processing_header".

如果我手动创建不自动关闭的消息:

1
2
<?xml version="1.0" encoding="utf-8"?>
<MyEnvelope xmlns="MyNameSpace"></MyEnvelope>

我没有错误。我的处理不受这些错误的影响,但它一定会对性能产生一些影响,并且会在 Group Hub 暂停实例视图中乱扔垃圾。

BizTalk 似乎将自闭合节点解释为空白而不是 null。这似乎与我尝试调用没有参数的服务有关,我需要发送一个自关闭节点但 BizTalk 什么都不发送。

处理没有内容的信封一定是一个常见问题。如何配置我的应用程序以使用自闭合信封节点接收和忽略这些消息?

  • 如果您从某个服务接收该消息,那么如果没有要发送的内容,您最好让该服务不发送任何内容:) 否则,如果您从数据库(?)轮询数据并使用 inboundOperationType = XmlPolling,那么您应该附加 MyEnvelope接收位置中的标头(RL 绑定中的 xmlStoredProcedureRootNodeName 参数)而不是轮询语句中的标头。如果您没有要轮询的数据,那么您的轮询过程应该返回零行。
  • @ArsenMagomedov 如果您可以访问该服务,这没关系。信封实际上是一个集合。我假设它在迭代项目之前被初始化。如果我有权访问,我只能在有数据要返回的情况下初始化集合。这将解决我的问题,但并不能真正回答有关 BizTalk 的问题
  • blog.tallan.com/2016/05/10/…


他们似乎经常改变处理空白的行为。请参阅 BizTalk 中默认空白行为的更改。我不确定您的问题是否相关,但值得一看。它没有提到 BizTalk 2013,但设置在主机中。如果您执行此配置设置,则需要专门为其设置主机,这样它就不会影响其他现有应用程序(如果有)。

安装以下更新之一会导致 BizTalk 更改默认行为以在映射期间保留 XML 中的空白:

  • BizTalk 2010 CU1 或更高版本
  • BizTalk 2009 CU3 或更高版本
  • BizTalk 2006 R2 SP1 CU4 或更高版本
  • 修补程序 2492255
  • 在某些环境中,转换删除空格可能是首选。为了恢复这种行为,可以采取以下步骤:

    在 BizTalk 2010 中,这是在主机级别设置的:

  • 打开 BizTalk Server 管理控制台
  • 将 BizTalk 组展开到平台设置 > 主机
  • 右键单击主机并选择设置
  • 选中旧版空白行为旁边的复选框
  • 点击确定
  • 重新启动此主机的 BizTalk 主机实例
  • 在 BizTalk 2009 和 2006 R2 中,此值在每台计算机级别设置:

  • 打开注册表编辑器
  • 在基于 x86 的计算机上找到并单击以下注册表子项:
    a€¢ HKEY_LOCAL_MACHINE\\\\Software\\\\Microsoft\\\\BizTalk Server\\\\3.0\\\\Administration
    对于基于 x64 的计算机,请单击以下注册表子项:
    a€¢ HKEY_LOCAL_MACHINE\\\\Software\\\\Microsoft\\\\BizTalk Server\\\\3.0\\\\Administration
    a€¢ HKEY_LOCAL_MACHINE\\\\Software\\\\Wow6432Node\\\\Microsoft\\\\BizTalk Server\\\\3.0\\\\Administration
  • 右键单击并选择 DWORD 值。
  • 键入 LegacyWhitespace 作为值名称,然后双击它并将值数据设置为 1。
  • 退出注册表编辑器。
  • 重新启动此计算机上的 BizTalk 主机实例
    • 不,我仍然遇到同样的错误。我不确定这是否相关,因为消息是在 BizTalk 之外创建的,我想这会影响 BizTalk 创建的消息而不是消耗的消息。


    我知道这是一个老问题,但我也遇到过同样的事情(特别是在返回空结果集的 SQL XML 轮询/过程中)。通常我通过确保如果 SQL 返回一个空的结果集(优化 Data Available 语句)就不会调用它来绕过它,但有时它并不完全可能或万无一失。最后,我在解码阶段编写了一个自定义管道组件。它旨在执行以下操作:

  • 检查这是否是一个信封模式(这个错误应该发生的唯一时间
  • 尽量容忍 BizTalk 是格式错误的 XML(至少对于 XML 中的无效字符)
  • 检查第一个内容元素(即根元素)是否为空
  • 如果是这样,用"FullEndElement"重写它。
  • 重置流并将它们添加到资源跟踪器以进行最终处理
  • 在异常情况下,悄悄地写入调试跟踪器,但让 BizTalk 从那里获取它 - 它会做的最坏的事情是产生嘈杂但无害的错误消息。
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Stream origStream = pInMsg.BodyPart.GetOriginalDataStream();
    try
    {
        XmlReaderSettings readerSettings = new XmlReaderSettings();
        readerSettings.CheckCharacters = false;
        readerSettings.CloseInput = false;

        XmlReader reader = XmlReader.Create(origStream, readerSettings);
        pContext.ResourceTracker.AddResource(reader);

        reader.MoveToContent();

        IDocumentSpec docSpec = pContext.GetDocumentSpecByType(reader.NamespaceURI +"#" + reader.LocalName);
        if (!string.IsNullOrWhiteSpace(docSpec.GetBodyPath()) && reader.IsEmptyElement) // this is an envelope schema with an empty root node
        {
            XmlWriterSettings writerSettings = new XmlWriterSettings();
            writerSettings.CheckCharacters = false;
            writerSettings.OmitXmlDeclaration = true;

            MemoryStream ms = new MemoryStream(); // for such a small stream, MemoryStream is perfectly fine - normally use VirtualStream.
            pContext.ResourceTracker.AddResource(ms);

            XmlWriter writer = XmlWriter.Create(ms, writerSettings);
            pContext.ResourceTracker.AddResource(writer);

            writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
            writer.WriteFullEndElement();
            writer.Flush();

            ms.Position = 0;
            pInMsg.BodyPart.Data = ms;
        }
    }
    catch (Exception e)
    {
        // swallow exception
        System.Diagnostics.Debug.WriteLine(e.ToString());
    }
    finally // make sure we're somewhat well behaved
    {
        if (pInMsg.BodyPart.Data.CanSeek == true)
            pInMsg.BodyPart.Data.Position = 0;
    }


    我没有看到或验证过这种行为,但我相信你;)。

    除非您每小时获得 10K 文件或类似情况,否则不要担心异常对性能的影响。

    为防止出现错误,您必须取消或重新格式化管道组件中的消息。

    • 使用管道也是我的第一个想法。我基本上只想在信封有子节点时调用 xml 反汇编程序,尽管我正在努力寻找如何做到这一点的体面示例。我有创建独立组件的示例,但我只想对 XMLReceive 做一点小改动。我不想重写这个并且有维护它前进的麻烦。


    另一个(非常)迟到的答案。它并没有真正回答 OP 的问题,但是由于我在这里谷歌搜索错误消息并最终导致我找到了这个解决方案,所以我想无论如何我都会回答,以防它帮助其他人。

    如果你能像我一样控制信封的结构,你可以给信封添加另一个层次,如果它是自动关闭的,它不会导致错误。

    所以,这会导致错误:

    1
    <MyEnvelope xmlns="MyNameSpace" />

    但这不会:

    1
    2
    3
    <MyEnvelope xmlns="MyNameSpace">
      <Body />
    </MyEnvelope>

    将模式的 Body XPath 设置为此嵌套级别,它应该可以正常处理。

    1
    2
    3
    4
    5
    6
    7
    <MyEnvelope xmlns="MyNameSpace">
        <Body>
            <MyData>ABC</MyData>
            <MyData>DEF</MyData>
            <MyData>GHI</MyData>
        </Body>
    </MyEnvelope>

    有关关于xml:BizTalk信封架构自闭合节点的更多相关文章

    1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

      我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

    2. ruby-on-rails - 关于 Ruby 的一般问题 - 2

      我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

    3. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

      我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

    4. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

      按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

    5. ruby-on-rails - 如何在 Rails 3 中禁用 XML 解析 - 2

      我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::

    6. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

      我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

    7. ruby - 如何使用 Nokogiri::XML::Builder 生成动态标签? - 2

      我正在遍历数组中的一组标签名称,我想使用构建器打印每个标签名称,而不是求助于“我认为:builder=Nokogiri::XML::Builder.newdo|xml|fortagintagsxml.tag!tag,somevalendend会这样做,但它只是创建名称为“tag”的标签,并将标签变量作为元素的文本值。有人可以帮忙吗?这个看起来应该比较简单,我刚刚在搜索引擎上找不到答案。我可能没有以正确的方式提问。 最佳答案 尝试以下操作。如果我没记错的话,我添加了一个根节点,因为Nokogiri需要一个。builder=Nokogi

    8. ruby - 如何让 Nokogiri 解析并返回 XML 文档? - 2

      这是一些奇怪的例子:#!/usr/bin/rubyrequire'rubygems'require'open-uri'require'nokogiri'print"withoutread:",Nokogiri(open('http://weblog.rubyonrails.org/')).class,"\n"print"withread:",Nokogiri(open('http://weblog.rubyonrails.org/').read).class,"\n"运行此返回:withoutread:Nokogiri::XML::Documentwithread:Nokogiri::

    9. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

      文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

    10. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

      1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

    随机推荐