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

Gus*_*Gus 2 debugging wcf 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ana*_*yal 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>
Run Code Online (Sandbox Code Playgroud)

这在配置节点下的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中找到它