Asp.net core Asp.Net核心Api默认路由

Asp.net core Asp.Net核心Api默认路由,asp.net-core,routing,Asp.net Core,Routing,我有一个非常基本的Asp.Net核心Api;我的控制器如下所示: [ApiController] [Route("[controller]")] public class TestController : ControllerBase { [HttpGet("{id}")] public IEnumerable<Resource> Test(string id) { // Breakpoint here } 然而,事实并非如此。事实

我有一个非常基本的Asp.Net核心Api;我的控制器如下所示:

[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    [HttpGet("{id}")]
    public IEnumerable<Resource> Test(string id)
    {
         // Breakpoint here
    }
然而,事实并非如此。事实上,以下URL确实:

https://localhost:5012/test/1
我的印象是URL的格式如下(从启动时开始):

因此,除非该操作是
索引

https://localhost:5012/controller/action/id    
但是,似乎接受的格式是:

https://localhost:5012/controller/id    

我的问题是,为什么会这样?

实际上是
ApiController
属性破坏了您的路由。看起来像是
app.UseEndpoints
仅为MVC配置路由。因此,解决方案是删除所有属性以获得以下代码

public class TestController : ControllerBase
{
    public string Test(string id)
    {
        return "OK";
    }
}
或者,如果要保留
ApiController
属性,还需要调整
Route
值。如果在项目中不使用MVC,则可以删除
app.UseEndpoints

[ApiController]
[Route("[controller]/[action]")]
public class TestController : ControllerBase
{
    [HttpGet("{id}")]
    public string Test(string id)
    {
        return "OK";
    }
}
除了回答,

你可以改变这个

[HttpGet("{id}")]
public IEnumerable<Resource> Test(string id)
[HttpGet(“{id}”)]
公共IEnumerable测试(字符串id)

[HttpGet(“[action]/{id}”)]
公共IEnumerable测试(字符串id)

通过使用值“{id}”指定属性,可以覆盖默认行为。删除属性并使用“/test/test/1”我最初尝试过,但没有什么不同这是否回答了您的问题?
[ApiController]
[Route("[controller]/[action]")]
public class TestController : ControllerBase
{
    [HttpGet("{id}")]
    public string Test(string id)
    {
        return "OK";
    }
}
[HttpGet("{id}")]
public IEnumerable<Resource> Test(string id)
[HttpGet("[action]/{id}")]
public IEnumerable<Resource> Test(string id)