Microsoft.AspNetCore.OData 8:按惯例找不到控制器

Posted

技术标签:

【中文标题】Microsoft.AspNetCore.OData 8:按惯例找不到控制器【英文标题】:Microsoft.AspNetCore.OData 8: controller is not found by convention 【发布时间】:2022-01-21 09:58:46 【问题描述】:

如docs 中所述,Microsoft.AspNetCore.OData 8 使用约定将控制器绑定到实体集。他们还提供了一个 sample 来演示此行为。

然而,我花了几个小时来设置一个带有简单控制器的最小 OData API,但控制器既不显示在 OData 路由调试页面 ($odata) 上,也无法通过浏览器访问。

这是模型:

namespace TestOData8

  public class Dummy
  
    public int Id  get; set; 
  

这是控制器:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.OData.Query;
using Microsoft.AspNetCore.OData.Routing.Controllers;

namespace TestOData8.Controllers

    public class DummiesController : ODataController
    
        [HttpGet]
        [EnableQuery]
        public IActionResult Query(CancellationToken ct)
        
            return Ok(Enumerable.Range(1, 10).Select(x => new Dummy()  Id = x ).AsQueryable());
        
    

这段代码设置了应用程序(这是 .NET 6 的设置方式;我也尝试过 .NET 5 没有成功):

using Microsoft.AspNetCore.OData;
using Microsoft.OData.Edm;
using Microsoft.OData.ModelBuilder;
using TestOData8;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers()
    .AddOData(opt => opt.Count().Filter().Expand().Select().OrderBy().SetMaxTop(5)
        .AddRouteComponents(GetEdmModel())
    );


IEdmModel GetEdmModel()

    var bldr = new ODataConventionModelBuilder();
    bldr.EntitySet<Dummy>("Dummies");
    return bldr.GetEdmModel();


var app = builder.Build();

// Configure the HTTP request pipeline.

app.UseHttpsRedirection();

//app.UseAuthorization();

app.UseODataRouteDebug();

app.UseRouting();

app.UseEndpoints(endpoints =>

    endpoints.MapControllers();
);

app.Run();

我已经断言了

EDM 模型已注册(此 $metadata 端点显示 Dummy 实体) 控制器名称与实体集匹配(Dummies -> DummiesController) 路由适用于不支持 OData 的控制器 将 EnableAttributeRouting 选项设置为 false 不会改变行为

我错过了什么/误解了什么?

【问题讨论】:

【参考方案1】:

修复很简单:控制器中方法的名称必须是“Get”;更改动作名称后,控制器开始工作:

public class DummiesController : ODataController

    [HttpGet]
    [EnableQuery]
    public IActionResult Get(CancellationToken ct)
    
        return Ok(Enumerable.Range(1, 10).Select(x => new Dummy()  Id = x ).AsQueryable());
    

感谢@JamesLove 在另一个answer 下的小评论。

【讨论】:

别担心!几个小时后我希望能救你!

以上是关于Microsoft.AspNetCore.OData 8:按惯例找不到控制器的主要内容,如果未能解决你的问题,请参考以下文章