You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ajax启用的WCF服务返回k__BackingField字段或空值问题求助

WCF返回序列化字段名异常/空值问题解决方案

问题根因

  • 加[Serializable]后出现k__BackingField后缀:[Serializable]特性默认序列化类的所有字段,自动属性的底层存储是编译器生成的隐藏 backing 字段,序列化时直接使用字段名而非开发者定义的属性名。
  • 移除[Serializable]后返回i:nil="true":WCF 默认使用DataContractSerializer进行序列化,未标记[DataContract]和[DataMember]的自定义类成员不会被识别为需要序列化的内容,因此返回空标记。

解决方案

方案1(WCF官方推荐,适配Ajax场景)

移除[Serializable]特性,改用WCF专属的序列化标记控制序列化行为:

  1. 给自定义类添加[DataContract]特性
  2. 给所有需要返回的公共属性添加[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:24:04