WCF嵌套DataContract接收值为null问题排查求助
问题原因与解决方案
这个问题我之前排查过类似的情况,核心问题出在嵌套数据契约的命名空间不匹配,导致WCF无法正确反序列化XML中的嵌套元素。
具体分析
你定义的ECardPaymentModel数据契约明确指定了Namespace = "":
[DataContract(Name = "Payment", Namespace = "")] [Serializable] public class ECardPaymentModel { [DataMember(Name = "TransactionInfo")] public TransactionInformation TransactionInfo { get; set; } }
但嵌套的TransactionInformation类的DataContract没有设置命名空间:
[DataContract(Name = "TransactionInfo")] public class TransactionInformation { // ... 属性定义 }
WCF默认会给未指定命名空间的数据契约分配程序集的默认命名空间,这就导致XML中的<TransactionInfo>元素(无命名空间)和契约中TransactionInformation类型的命名空间不匹配。反序列化时WCF找不到对应的映射关系,自然会把TransactionInfo及其子属性设为null。
而扁平化对象的场景下,所有DataMember都属于Payment契约的空命名空间,XML元素和契约完全匹配,所以能正确解析。
修复方案
给TransactionInformation的DataContract也加上Namespace = "",保持和父契约的命名空间一致:
[DataContract(Name = "TransactionInfo", Namespace = "")] public class TransactionInformation { [DataMember(Name = "customer")] public string Customer { get; set; } [DataMember(Name = "transid")] public string TransID { get; set; } }
修改后,XML中的<TransactionInfo>元素就能和契约类型正确匹配,WCF可以正常反序列化嵌套属性的值。
额外注意点
如果后续还有多层嵌套的类,记得所有相关的数据契约都要统一命名空间;另外,DataMember的Name属性要和XML元素名严格一致(大小写敏感),这也是反序列化成功的关键。
内容的提问来源于stack exchange,提问作者Sameer Anand
相关产品推荐
相关产品推荐

