在進行跨語言 WebService 調用時,C# 客戶端調用 Java 端編寫的服務經常會遇到返回值類型不匹配的問題。本文針對一個典型案例進行分析:Java 端提供了兩個方法 freightDeliveryCheck 和 confirmDelivery,前者調用正常,後者卻拋出類型轉換異常。
開發者反饋:第一個方法 freightDeliveryCheck 返回的值可以順利賦值給 C# 端的變量 ss;但調用第二個方法 confirmDelivery 時,卻報錯“返回的值不匹配”。這說明雙方在數據契約(WSDL/XSD)定義上存在差異,或者 Java 端第二個方法實際返回的對象結構與 WSDL 描述不一致。
List、Map 或自定義對象在序列化為 XML 時,與 C# 的 List<T>、Dictionary<K,V> 或類類型映射不準確。null,而 C# 端對應的值類型(如 int、bool)不可為 null,導致反序列化失敗。在 C# 端啟用網絡追蹤或使用 Fiddler/SoapUI 捕獲請求/響應報文,對比兩個方法的響應結構差異。
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.Net" maxdatasize="1024">
<listeners>
<add name="MyTraceFile"/>
</listeners>
</source>
</sources>
<sharedListeners>
<add name="MyTraceFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="net_trace.log" />
</sharedListeners>
<switches>
<add name="System.Net" value="Verbose" />
</switches>
</system.diagnostics>
重點檢查 confirmDelivery 對應的 complexType 定義,確認元素名、類型、命名空間、minOccurs/maxOccurs 是否與實際 XML 一致。
若 WSDL 無法修改,可在 C# 端實現 IXmlSerializable 或使用 XmlSerializer 手動反序列化響應流,繞過自動生成的代理類限制。
建議雙方協商採用「契約優先」開發模式:先定義 XSD Schema,再分別生成 Java 和 C# 代碼,從源頭消除類型不匹配。
svcutil.exe /serializer:XmlSerializer 生成代理類,提高兼容性。int?, bool? 等)。@XmlSeeAlso 註解顯式聲明所有可能的返回子類型。通過以上步驟,可有效定位並解決 C# 調用 Java WebService 時的返回值類型不匹配問題,保障跨平台集成的穩定性。