WCF - 如何检查发送/接收的消息?

39

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

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

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

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


为了澄清,我想要做的就是查看实际传递的消息。我不想对它们做任何操作,只想用自己的眼睛看到它们。

我喜欢WCF服务日志实用程序,但我认为我没有正确的设置。我看不到实际的SOAP消息,只能看到已接收到消息。

并且更进一步澄清,我不关心使用什么工具,只要能轻松地查看消息本身即可。

6个回答

47

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

以下是一个示例配置文件:

<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


12
我不得不从 System.ServiceModel.MessageLogging 中移除 propagateActivity="true",然后这个方法就正常工作了。 - Zane
这个解决方案对我有用(加上Zane的注释),而其他我找到的提议的解决方案是不完整的。 - erstaples
如果您确认应该删除 propagateActivity="true",为什么不修复答案呢?谢谢。 - Robert Cutajar
使用 propagateActivity 或不使用取决于您的具体情况。我在答案中引用的 MSDN 页面解释了何时以及为什么您可能想要使用 propagateActivity,该页面在底部进行了说明。 - Trevor Tubbs

14

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

启用WCF跟踪

顺便说一句,有些人不知道,你可以同时从服务器端和客户端打开跟踪,查看漂亮的图形中服务器和客户端操作之间的关联。

编辑:每当我需要捕获TCP/IP流量时,我使用WireShark。如果您需要以编程方式执行此操作,则可以使用SharpPCAP,因此我可以根据从网络中捕获的内容采取行动。但是对于故障排除,更好地依赖于WCF跟踪。


1
@Drew Marsh:在我看来,这是不可能确定的,因为我们不知道@michael希望查看消息的确切目的。查看它们用于跟踪目的是一回事,而出于可能要修改它们或执行某些其他通知的目的则是另一回事。 - casperOne
@Drew Marsh:我意识到我在这里有点学究,但你是根据@michael使用的工具而不是任何证据或事实陈述来推断他的意图。我曾多次使用Fiddler来查看消息,然后再修改发送方式,这并不是为了诊断目的。 - casperOne
4
我经常看到这个答案,但对我没有用。我想看到完整的进出消息。令人惊讶的是WCF没有提供这个功能。使用ASMX很容易实现。 - JohnOpincar
在Windows 8上,您必须以提升的权限运行应用程序(作为管理员运行),以便应用程序生成跟踪日志。 - Fer
谢谢你的回答。它对我帮助很大。 - Tarik
显示剩余4条评论

5
如果你想以编程方式检查消息,可以 实现 一个 IClientMessageInspector 接口 并将其注册到客户端中。
这样可以访问所有消息,无论使用什么绑定,而 使用像 Fiddler 这样的工具 只允许你使用 HTTP 传输通道检查消息。
请注意,使用此技术,你可以做更多的修改消息或执行其他操作(例如触发通知)。 如果你只想查看消息,则 使用跟踪 可能更容易。

5
IClientMessageInspector接口无法捕获最终输出。我本想依靠这个方法查看我的发送消息,但它没有捕获安全头信息。因此,我浪费了几天时间。一开始我以为头信息不存在,但最终我将客户端指向一个ASMX Web服务服务器,那里有真正起作用的老式消息记录,我发现我的头信息实际上是存在的。 - JohnOpincar

1

我正在尝试查看传递到我的服务器的SOAP消息。 - michael
@michael,是的,你可以使用WCF跟踪查看器来实现。我更新了链接并提供了更好的说明。你需要在web.config中添加代码以启用SOAP服务的跟踪功能。使用该工具,你将看到所有请求消息都会命中该服务。 - retrodrone
2
@retrodone:指令仍然指向相同的URL(实际上,它们是相同的链接)。我按照这些链接中所说的做了,我得到了Trace.svcLog文件,但是即使我将switchValue设置为All,我也看不到其中的实际消息。我看到有一条消息进来了,但我不知道在哪里可以查看实际的SOAP消息本身以XML格式。 - michael
@michael,抱歉。服务跟踪工具相当复杂。您可以尝试使用WireShark或Fiddler获得更好的结果。但是,请查看此帖子,其中显示了SOAP消息在服务跟踪工具中的外观。 - retrodrone

0
看看这个 StackOverflow 的帖子:如何使用 Fiddler 监控 WCF 服务 它回答了你的一些问题。如果你想检查线路上的所有内容而不是设置代理,你也可以使用类似 WireShark 的工具,因为 Fiddler 只能监控代理设置的内容。

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

你还可以看到我在项目中是如何做的示例 - wrapping textMessageEncoding, logging encoder, custom binding elementconfig


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接