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

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

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

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

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


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

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

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

【问题讨论】:

    标签: wcf soap client-server fiddler


    【解决方案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】:

    如果您想以编程方式检查消息,您可以 implementIClientMessageInspector 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】:

    看看这个 StackOverflow 线程: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、自定义绑定 elementconfig

      【讨论】:

        猜你喜欢
        • 2016-06-19
        • 1970-01-01
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-28
        相关资源
        最近更新 更多