2011-11-23 34 views
3

我們得到了,我們有我們的項目要消耗外部SOAP服務。所有這些都提供了WSDL數據,但其中很多不是.NET服務(大部分都是用Java編寫的)。我們使用wsdl.exe工具生成了許多客戶端代理。這個工具做它應該做的事情,它創建代理我們消費。強制ASMX代理使用XmlSerializer的,而不是DataContractSerializer的

的問題出現,一旦我們嘗試調用使用生成的代理這些服務的方法。爲了記錄目的,我們攔截所有SOAP請求,並且XML數據看起來與WSDL模式中指定的不同。

例如,如果一個字段被稱爲「名」,我們的代理會序列爲「名稱字段」。我想這是因爲名爲「Name」的屬性使用了一個名爲「nameField」的支持字段。另一方面的服務顯然不能解釋這種命名約定。

如果我們的ASMX代理使用舊的XmlSerializer,但由於某些原因,他們會選擇DataContractSerializer,這會完全混淆序列化並破壞客戶端與服務之間的兼容性,所以不會發生這種情況。

我的同事們都使出手動構造XML數據,然後用HttpWebRequest類發送。我認爲這在2011年是完全不可接受的,這是自動代理生成的目的。

我的問題是:爲什麼會這樣?爲什麼我們的代理使用DataContractSerializer並因此忽略了進程中的所有xml序列化屬性?有沒有辦法強制他們再次使用XmlSerializer?

我們使用.NET 4.0。

+0

所以你使用此ASMX作爲服務引用或Web引用?因爲.net對待它們非常不同。 – Darren

+0

作爲網頁參考。必須是關於配置的東西,因爲當我嘗試在一個乾淨的解決方案中複製問題時 - 一切正常。無所謂,我們現在正在使用解決方法。 – Vex

回答

2

如果您正在使用WCF默認爲DataContractSerializer。而且,如果類型沒有明確的[DataContract]/[DataMember]標記,然後DataContractSerializer將使用領域,這聽起來像是發生了什麼。

要改用XmlSerializer,請將[XmlSerializerFormat]添加到您的服務。見MSDN

您也可以嘗試將[XmlType][XmlRoot]添加到您的課程(如果它尚未存在)。

+0

正如我所說的,我們正在消耗外部服務和我對別人是如何實現的沒有發言權。出於某種原因,串行化程序在內部使用了錯誤的串行器。我會盡快研究XmlType和XmlRoot屬性。謝謝。 – Vex

+0

@Vex你如何參考外部服務? *恰恰*? –

+0

我搶WSDL,然後在其上運行Wsdl.exe用和生成代理。不能引用VS裏面的服務,因爲他們是一個VPN內,只有一個公司人有權訪問......他所能做的是保存的WSDL文件,並把它傳遞給我。關於安全的事情。 – Vex

相關問題