【问题标题】:How to debug/trace System.Web.Services.Protocols.SoapHttpClientProtocol.invoke (from Windows mobile)?如何调试/跟踪 System.Web.Services.Protocols.SoapHttpClientProtocol.invoke(来自 Windows 移动)?
【发布时间】:2021-05-16 05:38:25
【问题描述】:

我正在尝试从 C# 应用程序调用 Web 服务,但出现异常:

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

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

【问题讨论】:

  • 返回 html 的 web 服务可能意味着存在错误,因此服务器响应是错误页面而不是 xml。如果您可以记录服务器上发生的事情,这可能会有所帮助。
  • 也许您可以使用您的开发机作为移动设备的代理来启用 Fiddler 的使用?

标签: c# web-services debugging wireshark trace


【解决方案1】:

您可以打开一些内部进行 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 中运行代码时,这会在输出窗口(不是输出控制台)中添加相同的日志。

P.S.:如果您只需要请求和响应的标头以及打开和关闭连接的信息,您可以将日志级别更改为“信息”。

【讨论】:

    【解决方案2】:

    好的,这听起来很奇怪,但是您是否在 IIS 中使用默认文档?我知道这可能不应该是这种情况,但是当我为我的 Web 服务站点设置默认文档并将我的 ServiceReference 指向缩短的地址时,它能够运行......但是仅在本地。否则,我会得到同样的“Html 而不是 XML”错误。

    在我的情况下,解决方法是不再在服务参考中引用缩短的 URL,并输入完整的 URL(也就是不使用站点的默认文档属性。)

    【讨论】:

    • 我认为最初的问题是打印进出 SOAP 消息。希望您的回答也能有所帮助!
    • 是的 - 为你试图帮助解决这个家伙的根本问题而感到羞耻。也就是说,您可能应该这样做作为对他的问题的评论。
    • 嗯,我建议我这样做是有原因的。他的问题关于调试问题...但我的评论是解决他的问题可能是什么(这可能会为他节省一些调试时间。)我知道这让我绊倒了将近一天我遇到它时的开发时间 - 就像我说的那样,这是我在极其相似的情况下得到的完全相同的错误消息(在本地工作,在非本地工作以获取/更新服务参考,但实际上在非本地工作跑。)Ehn - 如果它对他没有帮助,那么它很有可能在未来帮助其他人。 :-)
    【解决方案3】:

    调试 SOAP 客户端的最简单和最好的方法是创建一个 SOAP 扩展来记录发送到 Web 服务或 Web 服务客户端的 SOAP 消息。

    Codeproject 有一个很好的教程如何正确地做到这一点:Efficient Tracing Using SOAP Extensions in .NET

    这是一篇较短的 MSDN 文章:How to: Implement a SOAP Extension

    还有一些物有所值的商业 SOAP 调试器,例如进行验证和调用的 XML Spy SOAP DebuggerSOAPSonar

    顺便说一句:如果您使用 PHP 或 Java,您基本上会使用相同的方法。

    【讨论】:

      猜你喜欢
      • 2013-04-10
      • 2016-10-15
      • 2011-08-02
      • 2010-10-02
      • 2013-08-30
      • 1970-01-01
      • 2013-09-24
      • 2021-09-28
      • 1970-01-01
      相关资源
      最近更新 更多