2008-12-19 104 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,性能將是可怕的。