2013-04-15 58 views
36

背景:

我排除问题,其中通过WCF在交易MSMQ发送(与netMsmqBinding)消息似乎消失了。使用WCF的代码位于我无法更改的第三方程序集中。我几乎没有什么线索来解决问题,但计划启用各种跟踪功能,以便确定问题所在。归属关系MSMQ端至端跟踪与WCF跟踪和应用级日志

语境:

  1. 我已经启用MSMQ End-to-End Tracing。它为发送的每条消息记录两个事件。

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

  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计划。

+1

你检查了[死信](http://msdn.microsoft.com/en-us/library/ms789035.aspx)队列吗? –

+1

是的,我做过了。它是空的。 –

+0

我喜欢使用perfmon来帮助跟踪消息的生命周期。队列计数器,系统计数器等应该能够看到各种传出队列和目标队列随着消息流经它们而上下移动。缺少多少条消息? –

回答

0

您可以配置windows MSMQ来感知消息的主题,以及主题是否包含关键词激发应用程序。此应用程序可以记录传入消息。在发件人一方,您可以将实际的消息编号写入消息主题,并将关键字添加到主题。在接收者侧的应用程序可以访问实际消息ID附近的主题添加关键字。

1

你听起来像你在正确的轨道上。但是你可以碰了一下这个:

使用SvcConfigEditor.exe

  1. 配置WCF详细跟踪的传播ACtiveity和活动跟踪
  2. 配置WCF MessageLogging为“畸形消息,服务信息,交通信息“

WCF 1

使用LogEntireMessage

WCF 3

在端到端,跟踪它的所有 WCF 2

确保你让这些*两侧的.config,你和第三方可执行文件。

收集你的日志文件,并将它们都添加到SvcTraceViewer.exe

0

它看起来像你的消息是由WCF丢弃,因为它以某种方式(如合同不匹配,的WCF邮件大小限制一个畸形超标)。

要捕获此错误,您可以编写一个ErrorHanlder来审计这些错误。 这里有一个link来做一个样本。

如果您使用的是Win 2008 R2或更高版本,另一种选择是使用内置的毒害消息处理。这里的文档是link

向该问题,跟踪端到端与应用踪迹标识符: 我将通过应用程序跟踪ID在消息报头(look here for an example)。

要审核服务端的消息头,我会使用WCF的IOperationInvoker来截获每个调用,并审核消息头中的id。

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