WCF - 检查正在发送/接收的消息?

Posted

技术标签:

【中文标题】WCF - 检查正在发送/接收的消息?【英文标题】:WCF - Inspect the messages being sent/received? 【发布时间】:2011-09-07 03:16:46 【问题描述】:

我有 2 个解决方案: - 服务器解决方案 - 客户端解决方案

服务器将自己注册到我的本地 IIS:http://localhost/MyApp/

客户端从 localhost 应用程序添加 WCF 服务(服务引用):http://localhost/MyApp/MyService.svc

当我运行客户端时,我希望能够看到来回传递的消息。我下载了 Fiddler,但它似乎不想显示任何正在发送的流量,除非我实际使用网络浏览器。我是在使用 Fiddler 错误还是应该为此使用其他工具?


澄清一下,我要做的是查看传入的实际消息。我不想对它们做任何事情,除了亲眼看到它们。

我喜欢 WCF 服务日志实用程序,但我认为那里的设置不正确。我看不到实际的肥皂消息,只是收到了一条消息。

还要进一步澄清,我不在乎我使用什么工具,只要我可以很容易地看到消息本身。

【问题讨论】:

【参考方案1】:

要查看消息内容,您必须在配置文件中添加 System.ServiceModel.MessageLogging 的源。 Trace Viewer 中的消息选项卡将显示特定服务调用的完整消息。

这是一个示例配置文件:

<configuration>

...

   <system.diagnostics>
      <sources>
         <source name="System.ServiceModel"
                      switchValue="All"
                      propagateActivity="true">
            <listeners>
               <add name="traceListener" />
            </listeners>
         </source>
         <source name="System.ServiceModel.MessageLogging"
                      switchValue="All">
            <listeners>
               <add name="traceListener" />
            </listeners>
         </source>
      </sources>
      <sharedListeners>
         <add name="traceListener"
                 type="System.Diagnostics.XmlWriterTraceListener"
                 initializeData="c:\Traces.svclog" />
      </sharedListeners>
   </system.diagnostics>

   <system.serviceModel>
   <diagnostics>
      <messageLogging logEntireMessage="true"
                                  logMalformedMessages="true"
                                  logMessagesAtServiceLevel="true"
                                  logMessagesAtTransportLevel="true"
                                  maxMessagesToLog="500"/>
   </diagnostics>

...

</system.serviceModel>

...

</configuration>

有关详细信息,请参阅 MSDN 上的配置跟踪主题。 http://msdn.microsoft.com/en-us/library/ms733025.aspx

【讨论】:

我不得不从 System.ServiceModel.MessageLogging 中删除 propagateActivity="true" 然后这对我有用 这个解决方案对我有用(连同 Zane 的注释),而我发现的其他建议解决方案不完整。 如果您确认应该删除propagateActivity="true",为什么不修复答案?谢谢。 是否选择使用propagateActivity 取决于您的具体情况。我在答案中引用的 msdn 页面在底部解释了您何时以及为什么要使用 propageActivity。【参考方案2】:

也许我错过了什么,但是... 为什么不使用 WCF 跟踪功能?这是一个很棒的故障排除工具。我也将它用于托管在 IIS/WAS 中的服务。

Enabling WCF Tracing

顺便说一句,有些人不知道,但是您可以同时打开服务器端和客户端的跟踪,查看器会以漂亮的图表显示服务器和客户端操作之间的相关性。

编辑:每当我必须捕获 TCP/IP 流量时,我都会使用WireShark。如果您需要以编程方式执行此操作,您可以使用SharpPCAP,这样我就可以对从网络捕获的内容采取行动。但是对于故障排除,依靠 WCF 跟踪要好得多。

【讨论】:

@Drew Marsh:这很难说,IMO,因为我们不知道@michael 希望看到这些消息的确切目的。出于跟踪目的查看它们是一回事,因为您可能想修改它们或执行某种其他类型的通知是另一回事。 @casperOne OP 试图使用 Fiddler 来查看它们,所以我认为很明显他们这样做是出于诊断目的。 @Drew Marsh:我意识到我在这里很迂腐,但你是根据他使用的工具推断@michael 的意图,而不是根据任何证据或事实陈述。我已经多次使用 fiddler 来查看消息,然后再去修改它的发送方式。这不是诊断目的。 我正在尝试查看传递到我的服务器的 SOAP 消息,而不是对它们做任何事情......只是查看它们。 我一直看到这个答案对我不起作用。我想查看完整的传入和传出消息。令人惊讶的是 WCF 不提供此功能。这对 ASMX 来说是微不足道的。【参考方案3】:

如果您想以编程方式检查消息,您可以 implement 和 IClientMessageInspector interface 并向您的客户注册。

这允许您访问所有消息,无论您使用什么绑定,而using tools like Fiddler 只允许您使用 HTTP 传输通道检查消息。

请注意,使用这种技术,您实际上可以做很多事情来修改消息或做更多事情(例如,触发通知)。如果您只想关注消息,那么using tracing 对您来说可能是一种更简单的方法。

【讨论】:

IClientMessageInspector 不会捕获最终输出。我依靠这种方法来查看我的传出消息,但它没有捕获安全标头。为此,我浪费了几天时间。我以为标题不存在,但我最终将我的客户端指向一个 ASMX Web 服务服务器,该服务器具有良好的老式消息日志记录,在 WCF 之前确实有效,我看到我的标题实际上在那里。【参考方案4】:

您的服务是 SOAP 还是 RESTful?您可以使用WCF Service Trace Viewer Tool 查看 SOAP 消息头和正文。配置您的 Web 服务以进行跟踪的说明是 here。

【讨论】:

我正在尝试查看正在传递到我的服务器的 SOAP 消息。 @michael,是的,您可以为此使用 WCF 跟踪查看器。我用更好的说明更新了链接。您需要检测您的 web.config 以在您的 SOAP 服务中启用跟踪。使用该工具,您将看到命中该服务的所有请求消息。 @retrodone:指令仍然指向相同的 url(实际上,它们是相同的链接)。我按照这些链接中所说的做了,我得到了 Trace.svcLog 文件,但是即使我将 switchValue 设置为 All,我也看不到其中的实际消息。我看到一条消息进来了,但我看不到在哪里可以看到 actual xml 格式的肥皂消息本身。 @michael,对不起。服务跟踪工具非常复杂。使用 WireShark 或 Fiddler 可能会获得更好的结果。但是,请查看this post,它向您展示了 SOAP 消息在 Service Trace 工具中的显示方式。【参考方案5】:

看看这个 *** 线程:How to use Fiddler to monitor WCF service

它回答了您的一些问题。如果您想检查线路上的所有内容而不是像 Fiddler 那样设置代理,您也可以使用 WireShark 之类的东西。

【讨论】:

【参考方案6】:

在 WCF 中,我们可以使用另一种方式查看实际的 SOAP 消息 - custom MessageEncoder - 一个低级管道扩展点。与消息检查器 (IDispatchMessageInspector / IClientMessageInspector) 不同,它可以查看原始字节内容,包括任何格式错误的 XML 数据。您需要将标准 textMessageEncoding 包装为自定义 binding element 并调整 config 文件以使用该自定义绑定。

您还可以查看我在项目中的示例 - wrapping textMessageEncoding、日志记录 encoder、自定义绑定 element 和 config。

【讨论】:

以上是关于WCF - 检查正在发送/接收的消息?的主要内容,如果未能解决你的问题,请参考以下文章

使用提升的上下文属性配置出站 WCF 消息正文

WCF 设计和实现服务协定(01)

在“手动”发送肥皂消息时,我收到 WCF 的 AddressingNone 错误

使用代码而不是配置文件将消息检查器添加到 WCF 服务

使用 WCF-Custom 处理 tableop 选择查询返回原始消息.. 不是数据

如何从流服务器接收消息?