【问题标题】:XML Parse error while processing the SOAP response处理 SOAP 响应时出现 XML 解析错误
【发布时间】:2008-12-19 16:10:46
【问题描述】:

我正在使用 C# .Net 2.0 编写 Web 服务客户端。服务器的soap实现已经过测试并且非常可靠。 gSoap/C++ 应用程序读取响应没有问题。然而,.Net 实现在调用其中一种方法时抱怨“XML 文档中存在错误”。 xml 解析器愉快地处理了从服务器收到的类似响应。

在我看来,MSXML 解析器(我希望这是 .Net 一直在使用的那个)是一个非常无情的解析器。

我无法控制服务器。我必须如何解决这个问题。所以,我正在考虑编写一个 SoapExtension 描述 here

所以我的问题是,我可以在反序列化阶段之前挂钩解析器并完全绕过反序列化阶段。

最重要的是,我如何指示 SOAP 存根使用我的扩展类?

【问题讨论】:

    标签: c# vb.net web-services


    【解决方案1】:

    首先,我会在反序列化阶段获取失败 XML 的快照,以尝试诊断问题。

    您无需重新编译即可将您的 soap 扩展程序挂接到您的客户端应用程序中。只需添加:

    <webServices>
        <soapExtensionTypes>
            <add type="DebugTools.SOAP.SOAPTrace.SoapTraceExtension, DebugTools.SOAP" 
                   priority="0" group="High"/>
        </soapExtensionTypes>
    </webServices>
    

    DebugTools.SOAP.SOAPTrace 是 SoapTraceExtension 的命名空间
    DebugTools.SOAP 是包含肥皂跟踪代码的程序集的名称。

    到您的 app.config 或 web.config 文件。

    如果您可以使用堆栈跟踪粘贴完整的异常,那将会很方便。可能有一些非常明显的东西。此外,如果可能的话,Web 服务的 WSDL 将非常有用。

    【讨论】:

      【解决方案2】:

      如果您想逐步完成序列化/反序列化代码,可以使用名为 SGen 的工具。这个是SDK自带VS的,用法如下:

      1. 使用普通的 VS 生成(或 wsdl.exe 生成)代理类编译应用程序(这些通常是隐藏的,位于名为 Reference.cs 的文件中

      2. 进入 Visual Studio cmd 提示符,打开 Debug/Release 文件夹(即 exe 编译到的文件夹)

      3. 在 cmd 提示符下键入以下内容(将 TheApplicationName 替换为您的应用程序名称): SGEN /keep TheApplicationName.exe

      您现在将看到已创建许多文件。删除所有生成的文件,除了.cs文件(包括它创建的dll)

      将 .cs 文件移动到源文件夹,并将其包含在您的项目中。

      将以下属性添加到您的 Reference.cs :

      [XmlSerializerAssembly()]
      

      您现在可以逐步执行实际的序列化和反序列化代码来查找实际问题(如果没有其他方法可以解决问题,您可以根据需要更改生成的代码)

      【讨论】:

      • 另请参阅hanselman.com/blog/…(如何:调试到 .NET XmlSerializer 生成的程序集)以了解生成反序列化代码的替代方法。
      【解决方案3】:

      顺便说一句,.NET 不使用 MSXML。它有自己的实现。如果 XmlReader 为每个 Read 调用调用 MSXML,性能将非常糟糕。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-07
        • 2016-09-03
        • 2019-01-02
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        • 1970-01-01
        • 2020-02-07
        相关资源
        最近更新 更多