37

背景:

我正在解决一个问题,即 WCF 通过事务性 MSMQ(使用 netMsmqBinding)发送的消息似乎消失了。使用 WCF 的代码位于我无法更改的第三方程序集中。我对问题所在几乎没有线索,但计划启用各种跟踪功能,以便查明问题所在。

语境:

  1. 我已启用 MSMQ端到端跟踪。它为每条发送的消息记录两个事件。

    • 将消息写入传出队列时的一个事件。此消息包含 MSMQ 消息 ID(由 guid 和整数组成,即 7B476ADF-DEFD-49F2-AF5A-0CF27C5152C0\6481271)。
    • 该消息通过网络发送时的另一个事件。
  2. 我启用了详细的WCF 跟踪

  3. 我还有应用程序级别的日志记录,它记录由应用程序代码定义的消息 ID(我们称之为“应用程序消息 ID”)。

  4. 我在发送的 MSMQ 消息上启用了正负源日志。

  5. 我在接收队列上启用了日志。

问题:

当消息丢失时,我知道丢失消息的应用程序 ID(它由发送方记录)。我现在想查看端到端跟踪以查看消息是否已写入传出队列。

如何将端到端跟踪中的事件与应用程序级别日志和 WCF 跟踪相关联?

想法:

  • 使用 System.Messaging 中的托管 MSMQ API 发送 MSMQ 消息时,消息的 MSMQ id 在消息发送后可用。但是,当 WCF 执行发送操作时,我还没有找到记录此内容的方法。WCF 跟踪记录了一个 MSMQMessageId guid,但令人惊讶的是,这个值并不是我猜想的实际 MSMQ id。是否可以访问实际的 MSMQ 消息 ID 并记录它?

  • 在应用程序日志中记录本机线程 ID 以及应用程序级别 ID 和时间戳。本机线程 ID 由 MSMQ 记录到端到端跟踪,因此这实际上可能足以关联。如果我找不到更优雅的解决方案,这对我来说是 B 计划。

4

3 回答 3

1

你听起来像是在正确的轨道上。但是,您可以通过以下方式提高一点:

使用 SvcConfigEditor.exe

  1. 为传播活动和活动跟踪配置 WCF 详细跟踪
  2. 为“格式错误的消息、服务消息、传输消息”配置 WCF 消息记录

周转基金 1

使用 LogEntireMessage

周转基金 3

端到端,追踪一切 WCF 2

确保在您的和第 3 方可执行文件的双方都启用这些 *.config。

收集您的日志文件,并将它们全部添加到 SvcTraceViewer.exe

于 2016-04-13T23:16:46.470 回答
0

您可以配置 Windows MSMQ 以感知消息的主题,如果主题包含关键字,则触发应用程序。此应用程序可以记录传入的消息。在发件人方面,您可以将实际消息 ID 写入消息主题并将关键字添加到主题。在接收方触发的应用程序中,可以访问主题中添加的关键字附近的实际消息 ID。

于 2014-02-21T14:08:42.513 回答
0

看起来您的消息正在被 WCF 丢弃,因为它在某些方面格式不正确(即合同不匹配,超出了 WCF 消息大小限制之一)。

要捕获此错误,您可以编写一个审核这些错误的 ErrorHanlder。这里是一个示例的链接。

如果您使用的是 Win 2008 R2 及更高版本,另一种选择是使用内置的有害消息处理。这是文档的链接

对于这个问题,使用应用程序跟踪标识符进行端到端跟踪:我将在消息头中传递应用程序跟踪 id(请参阅此处的示例)。

要在服务端审核消息头,我将使用 WCFIOperationInvoker拦截每个调用,并审核消息头中的 id。

这可以在进程的配置文件中进行配置,而无需更改第三方代码。是一个如何实现调用程序以及如何在配置中设置它的示例。

于 2016-06-13T11:28:35.430 回答