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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 09:13:11