为什么到控制器get方法的路由有歧义?



我有一个。net 6 API与一个基本控制器如下:

[Route("/odata/[controller]")]
public abstract class BaseController<T> : ODataController where T : class, DbModel
{
protected readonly ILogger<T> _logger;
protected AbstractBaseController(ILogger<T> logger)
{
_logger = logger;
}
[HttpGet]
public virtual IActionResult Get()
{
return Ok(_context.Set<T>().AsQueryable());
}
[EnableQuery]
[HttpGet("{key:Guid}")]
public virtual async Task<SingleResult<T>> Get([FromODataUri] Guid key)
{
var result = _context.Set<T>().Where(p => p.Id == key);
return SingleResult.Create(result);
}
}

最终控制器继承并最终覆盖这个基本控制器。这个API应该与Swagger一起记录。我现在看到这些路由似乎是不明确的。

我希望这两个Get方法的路由是这样的:

/odata/inheritedController
/odata/inheritedController/00000000-0000-0000-0000-000000000000

但是如果我调用继承的控制器asp。Net抛出一个异常

请求匹配多个端点

我尝试了多种路由和[HttpGet]属性的组合,但对我来说唯一有效的解决方案是将第一行更改为
[Route("/odata/[controller]/[action]")]

但现在提供了比两个端点我想。

是否有另一种方法来区分这两种方法?

也许您可以尝试将[HttpGet("DefaultGet")]添加到public virtual IActionResult Get()中,这样路由将与[HttpGet("{key:Guid}")]不同:

[HttpGet("DefaultGet")]
public virtual IActionResult Get()
{
return Ok(_context.Set<T>().AsQueryable());
}

这样动作的路径将是:

/odata/inheritedController/DefaultGet

最新更新