2008-12-19 87 views
1

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

对我来说,MSXML解析器(我希望这是一个.Net一直使用的)是一个非常不合理的解析器。

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

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

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

回答

2

首先,我会在Deserialise阶段抓取失败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

如果你想一步通过还原序列化/ deserialise代码,你可以使用一个名为SGEN工具。这个带有VS在SDK,并且被用作如下:

  1. 使用正常VS-生成(或Wsdl.exe用产生的)代理类​​编译应用程序(这些通常是隐藏的,并且在一个文件称为Reference.cs

  2. 下降到Visual Studio命令提示符,然后打开调试/ Release文件夹(即EXE已编译的文件夹)在命令提示符下

  3. 型(更换TheApplicationName您的应用程序的名称): SGEN/keep TheApplicationName.exe

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

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

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

[XmlSerializerAssembly()] 

您现在可以通过串行化实际和deserialising码步骤找到实际的问题(如果有没有其他的方法来解决这个问题,你可根据需要更改此生成的代码)

+0

另请参阅http://www.hanselman.com/blog/HOWTODebugIntoANETXmlSerializerGeneratedAssembly.aspx(如何:调试到.NET XmlSerializer生成的程序集)以获取生成解串行代码的替代方法。 – wimh 2012-01-09 13:11:33

0

顺便说一句,.NET不使用MSXML。它有自己的实现。如果XmlReader每调用一次读取调用MSXML,性能将是可怕的。