我正在构建一个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对象为空 - 没有警告或消息。有什么方法可以看到两者之间发生了什么?
所以,我想这最终是一个问题两个部分:
- 如何/我在哪里可以设置断点,观察SOAP消息越来越 处理后,
MessageEncoder
后,但在此之前它被送到到客户端代码? - 我的日志记录配置有什么问题,只记录外发的 消息?
更新:我使用MessageEncoder访问基本SOAP消息并将其转储到磁盘,然后使用外部工具对其进行验证。我会留下这个问题,因为我抱着希望,有一种我不知道的更好的方式。这个问题最终成为一个命名空间问题,这样“数据”就在那里,但在具有正确LocalName的元素内部,但名称空间不正确,因此它被忽略 - 这就解释了为什么没有抛出错误 - 这是从技术上讲是一个有效的文档,解析器正确地忽略了不相关的命名空间。 – Gus 2011-12-29 19:10:22