【发布时间】:2021-01-21 02:30:25
【问题描述】:
在 ASP.NET Core 5.0 应用中仅使用属性路由时,例如,Startup 中的以下内容:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
具有单个公共方法且没有路由属性的控制器类仍将匹配GET 请求,否则该请求将匹配该控制器。
例如GET api/test 将匹配下面的Index 方法(调用什么方法无关紧要),即使该方法没有路由属性:
[ApiController]
[Route("api/[controller]")]
public class TestController
{
public IActionResult Index()
{
return Ok();
}
}
但是,如果将另一个公共方法添加到该控制器类,同样没有属性,则会为 GET api/test 抛出 AmbiguousMatchException,因为路由无法确定要使用哪个方法。
如果将[HttpGet] 属性添加到这些方法之一,则问题得到解决。
我了解一种解决方案是确保所有方法都具有适当的路由属性,或者控制器上只有一种方法是公共的。
有没有办法防止这种默认/回退行为仍然匹配没有显式属性的方法?
属性路由是否可以配置为仅匹配具有显式路由属性的方法?
【问题讨论】:
-
我现在无法检查,但我想您可以在
app.UseRouting();调用Startup.Configure方法之后添加一些自定义中间件。类似this -
也许你可以用IActionDescriptorProvider做点什么
标签: c# asp.net-core