使用WCF跟踪和应用程序级日志记录结束跟踪
背景:
我正在解决WCF通过事务性MSMQ(使用netMsmqBinding)发送的消息似乎消失的问题。 使用WCF的代码位于我无法更改的第三方程序集中。 我几乎没有什么线索来解决问题,但计划启用各种跟踪功能,以便确定问题所在。
语境:
我已启用MSMQ端到端跟踪。 它为发送的每条消息记录两个事件。
我已启用详细的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
使用LogEntireMessage
在最后,跟踪它所有
确保你在两边启用这些* .config,你的和第三方可执行文件。
收集您的日志文件,并将它们全部添加到SvcTraceViewer.exe
您可以配置Windows MSMQ来感知消息的主题,以及主题是否包含关键字来激发应用程序。 此应用程序可以记录传入消息。 在发件人一方,您可以将实际的消息编号写入消息主题,并将关键字添加到主题。 在接收者侧的应用程序可以访问实际消息ID附近的主题添加关键字。
它看起来像你的消息被WCF丢弃,因为它以某种方式格式错误(即合同不匹配,超过了WCF消息大小限制之一)。
为了捕获这个错误,你可以写一个ErrorHanlder来审计这些错误。 这里有一个链接到一个样本。
如果您使用Win 2008 R2或更高版本,另一个选择是使用内置的毒害消息处理。 这里有一个链接到文档。
对于这个问题 ,要跟踪应用程序跟踪标识符的端到端:我会在消息头中传递应用程序跟踪标识(请参阅此处的示例)。
要审计服务端的消息头,我将使用WCF的IOperationInvoker
截获每个调用,并审核消息头中的标识。
这可以在过程的配置文件中进行配置,而无需更改第三方代码。这是如何实现调用程序以及如何在config中进行设置的示例。
链接地址: http://www.djcxy.com/p/55813.html