【问题标题】:Asp.Net Core Api Default RoutingAsp.Net Core Api 默认路由
【发布时间】:2020-05-31 11:52:29
【问题描述】:

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

[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    [HttpGet("{id}")]
    public IEnumerable<Resource> Test(string id)
    {
         // Breakpoint here
    }

我希望以下 URL 调用该方法并触发断点:

https://localhost:5012/test/test/1

然而,事实并非如此。事实上,下面的 URL 就是这样做的:

https://localhost:5012/test/1

我的印象是 URL 的格式如下(从启动开始):

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller}/{action=Index}/{id?}");
});

所以,除非那个动作是Index

https://localhost:5012/controller/action/id    

但似乎接受的格式是:

https://localhost:5012/controller/id    

我的问题是,这是为什么呢?

【问题讨论】:

  • 通过指定值为“{id}”的属性,您可以覆盖默认行为。删除属性并使用“/test/test/1”
  • 我最初尝试过,但没有任何区别
  • 这能回答你的问题吗? Conventional Routing in ASP.NET Core API

标签: asp.net-core routing


【解决方案1】:

除了pwrigshihanomoronimo的回答,

你可以改变这个

[HttpGet("{id}")]
public IEnumerable<Resource> Test(string id)

[HttpGet("[action]/{id}")]
public IEnumerable<Resource> Test(string id)

【讨论】:

    【解决方案2】:

    其实是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";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 2020-03-23
      • 1970-01-01
      • 2021-12-18
      • 2021-10-17
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多