2011-12-27 99 views
2

我正在构建一个Web服务客户端,与我无法控制的(基于Java的)远程Web服务进行交互。我可以调用Web服务操作,并通过数据包嗅探可以知道服务正在响应填充数据。但是,当响应进入客户端代码时,响应只是一个shell,所有的数据都是空的。WCF服务客户端:我如何调试解析响应

我怀疑在导致数据被无声地丢弃或忽略的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> 

我真正想要的响应消息的实际的解析过程中设置断点,但有消息记录器实际上登录响应也可能有所帮助。

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

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

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

更新:我使用MessageEncoder访问基本SOAP消息并将其转储到磁盘,然后使用外部工具对其进行验证。我会留下这个问题,因为我抱着希望,有一种我不知道的更好的方式。这个问题最终成为一个命名空间问题,这样“数据”就在那里,但在具有正确LocalName的元素内部,但名称空间不正确,因此它被忽略 - 这就解释了为什么没有抛出错误 - 这是从技术上讲是一个有效的文档,解析器正确地忽略了不相关的命名空间。 – Gus 2011-12-29 19:10:22

回答

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

如果您没有这个工具,你可以找到d它在Windows Sdk

相关问题