如何在 Windows 移动设备上调试/追踪 System.Web.Services.Protocols.SoapHttpClientProtocol.invoke?

10

我正试图从C#应用程序调用网络服务,但我遇到了异常:

InvalidOperationException 
client found response content type of 'text/html; charset=utf-8', but expected 'text/xml'

如何查看URL中的请求和响应消息? 我的服务在桌面上运行,但客户端在Windows Mobile CE 6.x上运行,移动设备通过USB连接到桌面。可能这就是我不能在Wireshark或Fiddler中看到HTTP流量的原因(我已经尝试过两者)。服务是正常工作的-我可以使用Postman检查它(方法返回正确且有意义的结果XML)。


一个返回HTML的Web服务可能意味着出现了错误,因此服务器响应是错误页面而不是XML。如果您可以记录服务器上发生的情况,这可能会有所帮助。 - derloopkat
也许你可以将开发机作为移动设备的代理,以启用Fiddler的使用? - martennis
3个回答

7

您可以在一些库中打开调试,这些库内部进行HTTP调用(在我的情况下,它们是HTTPS,因此无法通过Wireshark进行检查)。

您应该将以下内容添加到app.config中:

<system.diagnostics>
    <trace autoflush="true"/>
    <sources>
      <source name="System.Net" tracemode="protocolonly" maxdatasize="1024">
        <listeners>
          <add name="TraceFile"/>
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="TraceFile" type="System.Diagnostics.TextWriterTraceListener"
        initializeData="trace.log"/>
    </sharedListeners>
    <switches>
      <add name="System.Net" value="Verbose"/>
    </switches>
</system.diagnostics>

这将向您的exe运行的位置添加一个名为trace.log 的日志文件。如果您不知道服务在哪里运行,应该可以放置一个非相对路径。
此外,当在Visual Studio中运行代码时,它还会将相同的日志添加到输出窗口(而不是输出控制台)中。
附注:如果只需要请求和响应的标题以及有关打开和关闭连接的信息,则可以将日志级别更改为“信息”。

3
好的,这可能听起来有些奇怪,但您是否在IIS中使用了默认文档?我知道这可能不应该是这样,但当我为我的Web服务站点设置默认文档并将我的ServiceReference指向缩短的地址时,它能够运行...但只能在本地。否则,我会收到相同的“HTML而非XML”错误。
在我这种情况下的解决方法是不再在服务引用中引用缩短的URL,并输入完整的URL(即不使用站点的默认文档属性)。

我认为原始问题是要打印SOAP消息的输入和输出。希望你的答案也能有所帮助! - morhook
是的 - 你为试图帮助解决这位同胞的根本问题感到惭愧。话虽如此,你可能应该将这个作为对他问题的评论。 - STLDev
2
好的,我建议这样做是有原因的。他的问题确实是关于调试问题的...但我的评论是关于他问题的解决方法(这可能会节省他一些调试时间)。当我遇到这个问题时,它让我浪费了将近一天的开发时间 - 就像我说的,在极其相似的情况下,我得到了完全相同的错误消息(在本地工作,在非本地获取/更新服务引用时工作,但在实际运行时在非本地不起作用)。如果这对他没有帮助,那么未来有很大的机会它会帮助其他人。 :-) - Kevin

2
调试SOAP客户端最简单和最好的方法是创建一个SOAP扩展,记录发送到Web服务或Web服务客户端的SOAP消息以及接收到的SOAP消息。
Codeproject有一个很好的教程,介绍如何正确实现:Efficient Tracing Using SOAP Extensions in .NET
这里还有一篇较短的MSDN文章:How to: Implement a SOAP Extension
还有一些商业SOAP调试器也值得花钱购买,比如XML Spy SOAP DebuggerSOAPSonar,其中SOAPSonar可以进行验证和调用。
顺便说一句:如果你使用PHP或Java,基本上会采用同样的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接