【问题标题】:SQL Server Service Broker system error -9616, when can it happen?SQL Server Service Broker 系统错误-9616,什么时候会发生?
【发布时间】:2014-11-14 10:32:12
【问题描述】:

我的一个 Service Broker 对话配置中有一个场景,如下所示:

  • 一种消息类型,仅由发起方发送(VALIDATION = WELL_FORMED_XML,无 XSD
  • 具有此消息类型的合同
  • 都部署在发起端和目标端(远程机器)

有时我会在 目标队列 中发现 Service Broker 系统错误消息,如下所示:

<Error xmlns="http://schemas.microsoft.com/SQL/ServiceBroker/Error"><Code>-9616</Code><Description>A message of type 'here_is_the_name' was received and failed XML validation.  XML parsing: line 1, character 547, illegal xml character This occurred in the message with Conversation ID 'here_is_the_guid', Initiator: 1, and Message sequence number: 0.</Description</Error>

我查看了 Remus Rusanu 的博客 post,他说:

此系统错误被发送到已发送消息类型标记为符合特定 XML 架构但有效负载未能通过所述架构的 XML 验证的对话

在我的情况下,没有涉及 XML 架构,我试图在我的开发环境中使用相同的 SQL Server 版本重现这种情况,但我无法做到。


我想知道虽然我没有使用 XSD 架构,但是否有可能收到此系统错误消息?如果是这样,什么时候会发生,Service Broker 产生上述错误的场景是什么?

消息清楚地表明“XML 解析:第 1 行,字符 547,非法 xml 字符”,所以在我看来它与架构验证无关。 可能是传输级别遇到了一些问题(TCP 错误),这就是 Service Broker 生成此错误消息的原因吗?

【问题讨论】:

    标签: sql-server-2008 sql-server-2005 service-broker


    【解决方案1】:

    消息验证发生在目标队列中的消息入队时,而不是发送时。提供消息类型验证(NONE、XML、XDS)来保护您的应用程序。在 SEND 期间进行验证是不够的,因为恶意应用程序可以使用 Service Broker(有线协议模拟器)发送不带消息的消息。由于入队期间的验证是强制性的,因此在 SEND 期间添加验证会增加 CPU 负担,但价值不大。

    这意味着您的 SEND 端应用程序正在发送无效的 XML,而这会在目标端捕获。我博客上的措辞选择不当,我应该更明确一点,验证可能会导致架构失败(如果指定)或者它可能会失败 well formed XML 测试。

    您可以发布您要发送的消息正文吗?

    【讨论】:

    • 感谢 Remus 的回复。我了解第一部分,并且我知道 SSB 正在以这种方式工作,对 enqueue 的验证非常有意义。第二部分让我有点困惑,因为我一直都知道(例如,这是在关于 Fire and Forget 模式的博客上介绍的)如果发起者发送消息而目标不接受它,因为例如。它不是有效的 XML,目标将向发起者发送错误消息。这正是我多次观察到的,但在我在这个问题中描述的情况下,错误消息在目标队列中,这是单向消息交换。
    • 不幸的是,我无法发布消息正文,因为这发生在我们的生产环境中,不幸的是,最初使用下面的 Service Broker 的 EAI 应用程序是使用 Fire and Forget 模式部署的(是的,我知道它非常不好,我正试图影响一些人来改变这一点)。所以在我的情况下,即使转变保留也没有用。
    • 目标队列中的消息意味着来自目标的(无效 XML)回复被发起者拒绝。仔细检查目标代码。监控Broker:Conversation Event Class.
    • 我在 dev 上部署了我的生产对话配置并测试了您的建议。由于这是单向消息交换,并且如上所述,合同规定只有发起者可以发送消息,同时尝试从我得到的目标回复:Msg 8434, Level 16, State 1, Line 1发送是因为消息类型“msg_type_name”在合同中标记为 SENT BY INTITIATOR,但是此服务是目标。
    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2010-11-21
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多