WCF服务客户端:如何调试响应解析

时间:2011-12-27 21:32:16

标签: wcf debugging soap webservice-client

我正在构建一个Web服务客户端,以便与我的控制之外的(基于java的)远程Web服务进行交互。我可以调用Web服务操作,并通过数据包嗅探告诉服务正在响应填充的数据。但是,当响应进入客户端代码时,响应只是一个shell,所有数据都为null。

我怀疑在Web服务“管道”中发生了一个错误,导致数据被静默删除或忽略,但我找不到启用调试(甚至日志或错误消息?)的方法。在响应我的客户端代码之前收到响应。

我的App.config启用了消息记录,但只记录了外发消息:

<system.diagnostics>
    <sources>
        <source name="System.ServiceModel.MessageLogging">
            <listeners>
                <add name="messages"
                type="System.Diagnostics.XmlWriterTraceListener"  
                initializeData="c:\messages.svclog" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>

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

我真的想在实际解析响应消息期间设置一个断点,但让Message Logger实际记录响应也可能有所帮助。

我还配置了一个自定义MessageEncoder,它是解决远程服务解析器中的错误所必需的。我可以在ReadMessage上的MessageEncoder方法中添加断点,并且可以看到此时数据仍然存在。但是,下一步跳回到客户端代码,并且Response对象为空 - 没有警告或消息。有什么办法可以看出它们之间发生了什么?

所以,我想这最终只是一个由两部分组成的问题:

  1. 如何/在哪里可以设置断点来观察SOAP消息的获取 在MessageEncoder之后,但在发送到客户端代码之前处理?
  2. 我的日志配置有什么问题,只有传出 消息被记录?

1 个答案:

答案 0 :(得分:6)

以下是如何让响应跟踪为您工作的方法:

<强> 1。构造

<system.diagnostics>
<sharedListeners>
  <add name="sharedListener"
       type="System.Diagnostics.XmlWriterTraceListener"
       initializeData="C:\LogFiles\messages.svclog" />
</sharedListeners>
<sources>
  <source name="System.ServiceModel" switchValue="Verbose, ActivityTracing" >
    <listeners>
      <add name="sharedListener" />
    </listeners>
  </source>
  <source name="System.ServiceModel.MessageLogging" switchValue="Verbose">
    <listeners>
      <add name="sharedListener" />
    </listeners>
  </source>
</sources>
</system.diagnostics>
<system.serviceModel>
<diagnostics performanceCounters="All" wmiProviderEnabled="True">
  <messageLogging
       logEntireMessage="True"
       logMalformedMessages="True"
       logMessagesAtServiceLevel="True"
       logMessagesAtTransportLevel="True"
       maxMessagesToLog="3000"
       maxSizeOfMessageToLog="30000"/>
</diagnostics>
</system.serviceModel>

这在配置节点下的app.config / web.config中。

<强> 2。找到答案

快速验证看到您实际从远程服务接收服务响应是在Visual Studio中将日志文件作为xml文件打开并搜索

Source="TransportReceive"

您应该能够在此MessageLogTraceRecord节点中查看远程服务已响应的内容。

第3。模具

查看这些消息的推荐工具是SvcTraceViewer.exe

你应该能够在以下任何一个中找到它:

C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64

C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin

如果您没有此工具,可以在Windows Sdk

中找到它