C# 客戶端調用 WebService 方法,參數為自定義結構體 MyStruct。雖然客戶端與服務端定義了「同名、同字段」的結構體,但調用時拋出異常:
System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> Object reference not set to an instance of an object.
WebService (ASMX/WCF) 基於 **XML Schema (XSD)** 定義數據契約。客戶端與服務端雖代碼長得一樣,但屬於**兩個獨立的類型**(不同命名空間、不同程序集)。序列化時生成的 XML 命名空間不一致,服務端反序列化失敗,字段全為 null/default。
https://server:port/Service.asmx?wsdl)。Reference.cs)。var client = new MyServiceSoapClient();
var req = new MyService.RequestStruct { Field1 = "A", Field2 = 123 }; // 使用生成的類型
var resp = client.MyMethod(req);
[DataContract]/[DataMember])抽離到獨立 Class Library (SharedContracts.dll)。dataContractSerializer 已知類型,或 ASMX 無需額外配置。⚠️ 風險:版本不一致導致反序列化異常,升級需協同部署。
用 HttpWebRequest 發送手寫 XML,完全掌控命名空間、前綴。僅用於無法引用服務的異構系統(Java/Python/Go 調用 .NET ASMX)。
<system.diagnostics><sources><source name="System.ServiceModel" switchValue="Information, ActivityTracing">...</source></sources></system.diagnostics>,用 SvcTraceViewer.exe 分析異常詳情。xmlns、xsi:type、字段順序。try-catch 記錄完整異常堆棧,而非讓 SOAP Fault 吞沒細節。切勿手工複製結構體定義。Add Service Reference → 使用生成的類型 是 .NET WebService 開發的鐵律。若跨語言,請嚴格遵循 WSDL/XSD 契約,或改用 REST/JSON (Web API) 避免 SOAP 複雜性。