Ajax启用的WCF服务返回k__BackingField字段或空值问题求助
WCF返回序列化字段名异常/空值问题解决方案
问题根因
- 加
[Serializable]后出现k__BackingField后缀:[Serializable]特性默认序列化类的所有字段,自动属性的底层存储是编译器生成的隐藏 backing 字段,序列化时直接使用字段名而非开发者定义的属性名。 - 移除
[Serializable]后返回i:nil="true":WCF 默认使用DataContractSerializer进行序列化,未标记[DataContract]和[DataMember]的自定义类成员不会被识别为需要序列化的内容,因此返回空标记。
解决方案
方案1(WCF官方推荐,适配Ajax场景)
移除[Serializable]特性,改用WCF专属的序列化标记控制序列化行为:
- 给自定义类添加
[DataContract]特性 - 给所有需要返回的公共属性添加
[DataMember]特性
示例代码:
using System.Runtime.Serialization; // 移除原有的[Serializable]特性 [DataContract] public class UserInfo { [DataMember] public string FirstName { get; set; } [DataMember] public string HomePhone { get; set; } [DataMember] public string LastName { get; set; } [DataMember] public string MailAddress2 { get; set; } }
该方案不需要修改服务原有配置,改完重新发布即可,返回格式会自动匹配定义的属性名,不会出现字段后缀或者空值问题。
注意:如果你的Ajax WCF服务配置为返回JSON格式,本方案同样适配,无需额外修改,返回的JSON字段会直接匹配
[DataMember]标记的属性名。
方案2(保留[Serializable]特性场景)
如果因为其他业务需求必须保留[Serializable]特性,可以在服务的操作契约上添加[XmlSerializerFormat]特性,强制WCF使用XmlSerializer进行序列化,直接读取属性名而非底层字段:
示例代码:
using System.ServiceModel; using System.ServiceModel.Web; using System.Xml.Serialization; [ServiceContract] public interface IUserService { [OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Xml)] // 保留原有Ajax相关配置 [XmlSerializerFormat] // 新增本行配置 UserInfo GetUserInfo(); }
验证效果
修改完成后重新调用接口,返回结果会变为标准格式:
return (<FirstName>ABC</FirstName> )return (<HomePhone>1234567890</HomePhone> )return (<LastName>PQR</LastName> )return (<MailAddress2/> )
内容的提问来源于stack exchange,提问作者Prem
相关产品推荐
相关产品推荐

