ASP.NET Core 2中XML序列化/反序列化忽略属性失效问题
解决ASP.NET Core 2中[XmlIgnore]特性不生效的问题
嘿,我刚好碰到过类似的坑,这是因为ASP.NET Core 2默认的XML序列化机制和你预期的不一样导致的,给你一步步讲清楚怎么解决:
问题根源
ASP.NET Core 2里,默认处理XML响应的格式化器是DataContractSerializer,而你用的[XmlIgnore]特性是专门给XmlSerializer(也就是传统ASP.NET里常用的XML序列化器)设计的,所以这个特性对默认的序列化器完全不起作用。而[JsonIgnore]能生效是因为JSON序列化用的是Newtonsoft.Json,它能识别这个特性。
解决方案
只需要把XML格式化器切换成XmlSerializer就行,在你的ConfigureServices方法里做如下修改:
public void ConfigureServices(IServiceCollection services) { services.AddMvc() // 添加XmlSerializer格式化器,替换默认的DataContractSerializer .AddXmlSerializerFormatters() .AddMvcOptions(options => { // 这里保留你原来的其他配置逻辑即可 }); }
验证效果
配置完成后,你的PointOfInterest模型里的[XmlIgnore]特性就会被正确识别:
public class PointOfInterest // 子模型 { public string Name { get; set; } public int CityId { get; set; } // 外键 [JsonIgnore] // 用于避免循环引用 [XmlIgnore] public City City { get; set; } // 父模型 }
当客户端发送Accept: application/xml请求时,响应里就不会包含City属性了,完美解决循环引用和不需要的属性暴露问题。
额外小提示
如果你不想切换序列化器,坚持用默认的DataContractSerializer,那可以把[XmlIgnore]换成[IgnoreDataMember]特性,也能达到忽略属性的效果。不过我更推荐用XmlSerializer,因为它的行为和我们熟悉的传统ASP.NET XML序列化一致,上手更顺畅。
内容的提问来源于stack exchange,提问作者Anil
相关产品推荐
相关产品推荐

