使用WCF跟踪和应用程序级日志记录结束跟踪

背景:

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

语境:

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

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

  • 我也有应用程序级日志记录,记录应用程序代码定义的消息ID(我们称之为“应用程序消息ID”)。

  • 我已经对发送的MSMQ消息启用了正面和负面的源日志记录。

  • 我已在接收队列上启用日记功能。

  • 问题:

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

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

    思路:

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

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


  • 你听起来像你在正确的轨道上。 不过,你可能会遇到这样的情况:

    使用SvcConfigEditor.exe

  • 配置WCF详细跟踪以传播活动性和活动跟踪
  • 为WCF MessageLogging配置“格式错误的消息,服务消息,传输消息”
  • WCF 1

    使用LogEntireMessage

    WCF 3

    在最后,跟踪它所有 WCF 2

    确保你在两边启用这些* .config,你的和第三方可执行文件。

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


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


    它看起来像你的消息被WCF丢弃,因为它以某种方式格式错误(即合同不匹配,超过了WCF消息大小限制之一)。

    为了捕获这个错误,你可以写一个ErrorHanlder来审计这些错误。 这里有一个链接到一个样本。

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

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

    要审计服务端的消息头,我将使用WCF的IOperationInvoker截获每个调用,并审核消息头中的标识。

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

    链接地址: http://www.djcxy.com/p/55813.html

    上一篇: End trace with WCF Trace and application level logging

    下一篇: MSMQ and WCF contracts