ASMX转WCF服务:返回null时客户端接收空DataSet的问题求助
解决WCF返回null DataSet时客户端收到空DataSet的问题
这个坑我之前在把遗留ASMX服务迁移到WCF的时候踩过!核心原因是ASMX和WCF默认使用的序列化器对DataSet的null处理逻辑不一样:
- ASMX用的是
XmlSerializer,当返回null的DataSet时,会直接序列化为null,客户端拿到的也是null; - WCF默认用
DataContractSerializer,它会把null的DataSet序列化为一个空的DataSet实例(也就是初始化过但没有任何表数据的DataSet),而你用ASMX时代理的调用方式(比如老的Web引用)去接这个结果,就会把空实例当成非null值,导致原来判断if (ds == null)的逻辑完全失效。
下面给你两个最实用的解决办法:
方法一:让WCF使用和ASMX一致的序列化器(推荐)
直接在WCF服务契约的操作上加上[XmlSerializerFormat]特性,强制WCF使用XmlSerializer来处理序列化,和ASMX的行为对齐:
[ServiceContract] public interface IYourService { [OperationContract] [XmlSerializerFormat] // 关键:切换到XmlSerializer DataSet GetTargetDataSet(); }
这样修改后,当服务端返回null的DataSet时,客户端就能正确接收到null,原来的判断逻辑不用改就能正常工作。
方法二:调整客户端的判断逻辑(如果不能改服务端)
如果因为各种限制没法修改服务端代码,那就在客户端把原来的null判断扩展一下,同时检查是否是空DataSet:
DataSet result = serviceClient.GetTargetDataSet(); // 同时判断null和空DataSet(无表或表无数据,根据你的业务场景调整) if (result == null || (result.Tables.Count == 0 && result.DataSetName == string.Empty)) { // 原来处理null的逻辑 } else { // 正常处理数据的逻辑 }
不过这个方法要注意:如果服务端本来就可能返回合法的空DataSet(比如查询结果为空但结构正常),那这个判断逻辑会把合法场景误判成null,所以一定要结合你的业务场景调整判断条件。
内容的提问来源于stack exchange,提问作者Christopher Thomas Frisbie
相关产品推荐
相关产品推荐

