ASP.NET Core 8中自定义ODataSerializer未生效问题求助
ASP.NET Core 8 OData自定义序列化器不生效问题排查与解决方案
1. 修复代码语法错误
原代码中AddNewtonsoftJson()末尾多了一个分号,导致后续的.AddODataNewtonsoftJson()成为独立调用,破坏了服务配置的链式结构,这是核心语法问题。调整后的配置链必须保证连续:
services .AddControllers() .AddOData(options => { options.Expand().Select().Filter().OrderBy().Count().SetMaxTop(10); options.UrlKeyDelimiter = ODataUrlKeyDelimiter.Parentheses; var model = AllModelConfiguration.GetEdmModel(); options.AddRouteComponents(ApiPrefix, model, a => { a.AddSingleton<IEdmModel>(sp => model); a.AddSingleton<ODataResourceSerializer, IgnoreNullPropertiesSerializer>(); a.AddSingleton<ODataSerializerProvider, MyODataSerializerProvider>(); }); }) .AddODataNewtonsoftJson(options => { var contractResolver = new CamelCasePropertyNamesContractResolver() { NamingStrategy = new CamelCaseNamingStrategy(), }; options.SerializerSettings.ContractResolver = contractResolver; options.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; options.SerializerSettings.Converters.Add(new StringEnumConverter()); options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; });
2. 确保自定义序列化器提供者实现正确
MyODataSerializerProvider必须继承自DefaultODataSerializerProvider,并在合适的时机返回自定义序列化器实例,否则系统会使用默认序列化器:
public class MyODataSerializerProvider : DefaultODataSerializerProvider { private readonly IgnoreNullPropertiesSerializer _nullIgnoringSerializer; public MyODataSerializerProvider(IServiceProvider serviceProvider) : base(serviceProvider) { _nullIgnoringSerializer = serviceProvider.GetRequiredService<IgnoreNullPropertiesSerializer>(); } public override ODataEdmTypeSerializer CreateEdmTypeSerializer(IEdmTypeReference edmType) { // 对实体或复杂类型使用自定义序列化器 if (edmType.IsEntity() || edmType.IsComplex()) { return _nullIgnoringSerializer; } return base.CreateEdmTypeSerializer(edmType); } }
3. 完善自定义序列化器的空属性过滤逻辑
IgnoreNullPropertiesSerializer需要重写核心方法,主动过滤null值属性:
public class IgnoreNullPropertiesSerializer : ODataResourceSerializer { public IgnoreNullPropertiesSerializer(ODataSerializerProvider serializerProvider) : base(serializerProvider) { } public override ODataResource CreateResource( SelectExpandNode selectExpandNode, ResourceContext resourceContext) { var resource = base.CreateResource(selectExpandNode, resourceContext); // 移除值为null的属性 resource.Properties = resource.Properties.Where(p => p.Value != null).ToList(); return resource; } }
4. 移除冗余配置
删除单独的AddNewtonsoftJson()调用,AddODataNewtonsoftJson()已经集成了Newtonsoft.Json的配置能力,重复配置会导致序列化逻辑冲突。
5. 验证控制器路由匹配
确保目标控制器继承自ODataController,且路由配置与ApiPrefix匹配,保证请求走OData序列化流程而非普通JSON序列化。
内容的提问来源于stack exchange,提问作者Satashree Roy
相关产品推荐
相关产品推荐

