Microsoft.AspNetCore.OData 8:按照约定未找到控制器 [英] Microsoft.AspNetCore.OData 8: controller is not found by convention

查看:44
本文介绍了Microsoft.AspNetCore.OData 8:按照约定未找到控制器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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());
        }
    }
}

此代码设置应用程序(这是.NET6的设置方式;我也尝试过.NET5,但没有成功):

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端点显示虚拟实体)
  • 控制器的名称与实体集(Dummies->;DummiesController)匹配
  • 路由适用于不支持OData的控制器
  • EnableAttributeRouting选项设置为false不会更改行为

我遗漏/误解了什么?

推荐答案

修复非常简单:控制器中的方法名称必须为&q;GET&q;;更改操作名称后,控制器可以工作:

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

Thansk to@JamesLove获取另一个answer下的小评论。

这篇关于Microsoft.AspNetCore.OData 8:按照约定未找到控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆