我有一个。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