Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将MSMQ端到端跟踪与WCF跟踪和应用程序级日志记录相关联 背景:_Wcf_Msmq - Fatal编程技术网

将MSMQ端到端跟踪与WCF跟踪和应用程序级日志记录相关联 背景:

将MSMQ端到端跟踪与WCF跟踪和应用程序级日志记录相关联 背景:,wcf,msmq,Wcf,Msmq,我正在对WCF通过事务性MSMQ(使用netMsmqBinding)发送的消息似乎消失的问题进行故障排除。使用WCF的代码位于我无法更改的第三方程序集中。我对问题所在没有什么线索,但我计划启用各种跟踪功能,以确定问题所在的位置 背景: 我已启用MSMQ。它为每个发送的消息记录两个事件 将消息写入传出队列时发生的一个事件。此消息包含MSMQ消息id(由guid和整数组成,即7B476ADF-DEFD-49F2-AF5A-0CF27C5152C0\6481271) 通过网络发送该消息时发生的另一个

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

背景:
  • 我已启用MSMQ。它为每个发送的消息记录两个事件

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

  • 我还有应用程序级日志记录,它记录由应用程序代码定义的消息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计划


    您可以将windows MSMQ配置为感测消息的主题,如果主题包含关键字,则启动应用程序。此应用程序可以记录传入的消息。在发件人端,您可以将实际的邮件id写入邮件的主题,并将关键字添加到主题中。在接收方,应用程序可以访问主题中添加的关键字附近的实际消息id

    听起来你的思路是对的。但是,您可以通过以下方式增加一些:

    使用SvcConfigEditor.exe

  • 为传播活动性和活动跟踪配置WCF详细跟踪
  • 为“格式错误的消息、服务消息、传输消息”配置WCF MessageLogging
  • 使用日志信息

    从一端到另一端,追踪一切

    确保在您和第三方可执行文件的两侧都启用了这些*.config


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

    WCF似乎正在丢弃您的邮件,因为它在某种程度上存在格式错误(即合同不匹配,超出了WCF邮件大小限制之一)

    要捕获此错误,可以编写一个ErrorHander来审核这些错误。 下面是一个这样做的示例

    如果您使用的是Win 2008 R2及更高版本,另一个选项是使用内置的毒药消息处理。这是给医生们的一封信

    对于问题,要使用应用程序跟踪标识符进行端到端跟踪: 我将在消息头()中传递应用程序跟踪id

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


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

    您检查队列了吗?是的,我检查了。它是空的。我喜欢使用perfmon来帮助跟踪消息的生命周期。队列计数器、系统计数器等应能在消息流经时看到各种传出队列和目标队列上下移动。有多少信息丢失?偶尔会有一些信息“丢失”。您是否能够通过perfmon了解特定消息的情况?