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:按惯例找不到控制器的主要内容,如果未能解决你的问题,请参考以下文章