使用 $select 或 $filter 时,OData 默认为帕斯卡大小写

Ali*_*uri 1 json.net odata asp.net-core asp.net-core-webapi

在我的 .net core 3.1 Web api 项目中,我正在使用Microsoft.AspnetCore.OdataMicrosoft.AspnetCore.Mvc.NewtonsoftJson. 我的启动看起来像这样:

    services.AddOData();
            services.AddControllers(options =>
            {
                IEnumerable<ODataOutputFormatter> outputFormatters =
                    options.OutputFormatters.OfType<ODataOutputFormatter>()
                        .Where(foramtter => foramtter.SupportedMediaTypes.Count == 0);

                foreach (var outputFormatter in outputFormatters)
                {
                    outputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/odata"));
                }

            }).AddNewtonsoftJson(options =>
            {
                options.UseCamelCasing(false);
                options.SerializerSettings.ContractResolver = new DefaultContractResolver() { NamingStrategy = new CamelCaseNamingStrategy() };
            });
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
app.UseEndpoints(endpoints =>
            {
                endpoints.MapHealthChecks("/health");
                endpoints.MapControllers().RequireAuthorization();
                endpoints.EnableDependencyInjection();
                endpoints.Select().OrderBy().Filter();
                endpoints.MapODataRoute("odata", "odata", GetEdmModel());
            });
}

IEdmModel GetEdmModel()
        {
            var builder = new ODataConventionModelBuilder();
            builder.EnableLowerCamelCase();
            builder.EntitySet<Ebp>("Ebp");
            return builder.GetEdmModel();
        }
Run Code Online (Sandbox Code Playgroud)

当我GET使用 调用端点时{{baseUrl}}/odata/coaching/ebp/all,结果如camelCase我所料。

在此输入图像描述

然而,当我引入任何$select$filter选项进行查询时,我的回答变为PascalCase

在此输入图像描述

为什么会发生这种情况?

Ali*_*uri 5

答案就在这篇文章里。在AddNewtonSoftJson附加到服务集合的方法中,我应该将设置SerializerSettings.ContractResolverCamelCasePropertyNamesContractResolver

services.AddOData();
        services.AddControllers(options =>
        {
            IEnumerable<ODataOutputFormatter> outputFormatters =
                options.OutputFormatters.OfType<ODataOutputFormatter>()
                    .Where(foramtter => foramtter.SupportedMediaTypes.Count == 0);

            foreach (var outputFormatter in outputFormatters)
            {
                outputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/odata"));
            }

        }).AddNewtonsoftJson(options =>
        {
            options.UseCamelCasing(false);
            options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        });
Run Code Online (Sandbox Code Playgroud)

  • 添加这个对我有用: .AddNewtonsoftJson(o=&gt;o.UseCamelCasing(true)); (2认同)