.Net Core 上的 OData 不会在 $select 上返回正确的结果

Gio*_*iox 13 c# odata asp.net-web-api asp.net-core

我已将 OData 添加到我的 WebAPI 项目中。

版本:

  1. 核心 3.1
  2. OData 7.3.0(测试版,以便与 Core 3.x 配合使用)
  3. 英孚核心 3.1.0

这是我的startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<Models.Contexts.EntityContext>(opts => opts.UseSqlServer(Configuration["ConnectionString:MailBackup"]));
        services.AddControllers();
        services.AddMvc(options =>
        {
            options.EnableEndpointRouting = false;
        }).SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_3_0);

        services.AddOData();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc(routeBuilder =>
        {
            routeBuilder.EnableDependencyInjection();
            routeBuilder.Expand().Select().OrderBy().Filter();
        });

        app.UseHttpsRedirection();
        app.UseAuthorization();

    }
}
Run Code Online (Sandbox Code Playgroud)

控制器是:

[EnableQuery()]
[HttpGet]
[Route("GetAll")]
public IQueryable<Models.EmailMessage> GetAll()
{    
    return this._context.EmailMessages;
}
Run Code Online (Sandbox Code Playgroud)

API 工作正常,但是当我尝试添加一些 OData 操作(如 $select)时,我得到以下结果而不是预期结果:

{
    "instance": null,
    "container": {},
    "modelID": "529e8054-04c4-4729-aa91-d7eaf67a55d0",
    "untypedInstance": null,
    "instanceType": null,
    "useInstanceForProperties": false
},
{
    "instance": null,
    "container": {},
    "modelID": "529e8054-04c4-4729-aa91-d7eaf67a55d0",
    "untypedInstance": null,
    "instanceType": null,
    "useInstanceForProperties": false
},
Run Code Online (Sandbox Code Playgroud)

小智 21

我有同样的问题。这为我解决了这个问题。也许 odata 与 Asp.Net 3.1 中新的 JSON 序列化程序不完全兼容。我不知道。

services.AddControllers(mvcOptions =>
           mvcOptions.EnableEndpointRouting = false)
       .AddNewtonsoftJson();
Run Code Online (Sandbox Code Playgroud)

  • 您可以在 https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.NewtonsoftJson/ 找到 NuGet (3认同)
  • 这就是答案!具体来说,问题在于 System.Text.Json 序列化器的迭代深度仅限于 32 层。目前,没有简单的方法可以更改 JsonSerializerOptions.MaxDepth 值,但在 dotnetcore 5 的路线图中:https://github.com/dotnet/runtime/issues/31094#issuecomment-567232806 (2认同)