背景:
我正在解决一个问题,即 WCF 通过事务性 MSMQ(使用 netMsmqBinding)发送的消息似乎消失了。使用 WCF 的代码位于我无法更改的第三方程序集中。我对问题所在几乎没有线索,但计划启用各种跟踪功能,以便查明问题所在。
语境:
我已启用 MSMQ端到端跟踪。它为每条发送的消息记录两个事件。
- 将消息写入传出队列时的一个事件。此消息包含 MSMQ 消息 ID(由 guid 和整数组成,即 7B476ADF-DEFD-49F2-AF5A-0CF27C5152C0\6481271)。
- 该消息通过网络发送时的另一个事件。
我启用了详细的WCF 跟踪。
我还有应用程序级别的日志记录,它记录由应用程序代码定义的消息 ID(我们称之为“应用程序消息 ID”)。
我在发送的 MSMQ 消息上启用了正负源日志。
我在接收队列上启用了日志。
问题:
当消息丢失时,我知道丢失消息的应用程序 ID(它由发送方记录)。我现在想查看端到端跟踪以查看消息是否已写入传出队列。
如何将端到端跟踪中的事件与应用程序级别日志和 WCF 跟踪相关联?
想法:
使用 System.Messaging 中的托管 MSMQ API 发送 MSMQ 消息时,消息的 MSMQ id 在消息发送后可用。但是,当 WCF 执行发送操作时,我还没有找到记录此内容的方法。WCF 跟踪记录了一个 MSMQMessageId guid,但令人惊讶的是,这个值并不是我猜想的实际 MSMQ id。是否可以访问实际的 MSMQ 消息 ID 并记录它?
在应用程序日志中记录本机线程 ID 以及应用程序级别 ID 和时间戳。本机线程 ID 由 MSMQ 记录到端到端跟踪,因此这实际上可能足以关联。如果我找不到更优雅的解决方案,这对我来说是 B 计划。