热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

BizTalkenvelopeschemaself-closingnode我创建了一


BizTalk envelope schema self-closing node


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










1
2
3
4
5
6



version="1.0" encoding="utf-8"?>
xmlns="MyNameSpace">

    >
ABC>


    >DEF>

    >GHI>
>


保存为










1
2



version="1.0" encoding="utf-8"?>
xmlns="MyNameSpace">ABC>


,










1
2


  version="1.0" encoding="utf-8"?>

  xmlns="MyNameSpace">DEF>











1
2


  version="1.0" encoding="utf-8"?>

  xmlns="MyNameSpace">GHI>


太棒了。

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










1
2



version="1.0" encoding="utf-8"?>
xmlns="MyNameSpace"/>


我收到错误消息

Source:"XML disassembler" Receive Port:"InLocation" URI:

"c:\MyLocation*.xml" Reason: Unexpected event ("eos") in state

"processing_header".

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










1
2



version="1.0" encoding="utf-8"?>
xmlns="MyNameSpace">>


我没有错误。我的处理不受这些错误的影响,但它一定会对性能产生一些影响,并且会在 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



    xmlns="MyNameSpace" />


    但这不会:










    1
    2
    3



    xmlns="MyNameSpace">

      />
    >



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










    1
    2
    3
    4
    5
    6
    7



    xmlns="MyNameSpace">

        >


            >ABC>

            >DEF>

            >GHI>

        >
    >








    推荐阅读
    • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
      本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
    • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
      本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
    • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
    • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
    • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
    • Web开发框架概览:Java与JavaScript技术及框架综述
      Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
    • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
      技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
    • 在 CentOS 7 中,为了扩展可用软件包的数量,通常需要配置多个第三方软件源。这些第三方源包括 EPEL、Nux Dextop 和 ELRepo 等,它们提供了大量官方源中未包含的软件包,从而增强了系统的功能性和灵活性。通过正确配置这些源,用户可以轻松安装和管理更多种类的软件,满足不同的需求。 ... [详细]
    • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
    • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
    • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
    • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
    • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
    • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
      在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
    • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
    author-avatar
    手机用户2502936263
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有