ASP.NET Core路由返回404

问题描述

我正在使用ASP.NET Core 3.1创建Web api,并尝试将URL路由到控制器。到目前为止,我有一个像这样的基本控制器:

    [Route("abc")]
    [ApiController]
    public class ABCController : ControllerBase
    {
        // GET: abc/1234
        [HttpGet("{id}")]
        public async Task<ActionResult<string>> GetABCService(long id)
        {
              ...
        }
    }

当我输入http:// myurl / abc / 1234时,可以正确地将我路由到该页面。我想连线的控制器的下一个内容是这样的:

    [Route("xxx")]
    [ApiController]
    public class XXXController : ControllerBase
    {

        // GET: abc/1234/XXX
        [HttpGet("{id}")]
        public async Task<ActionResult<string>> GetXXXService(long id)
        {
              ...
        }
    }

当我输入http:// myurl / abc / 1234 / xxx时,它总是会给我 404 。我通过这样设置端点来使第一个作品起作用:

app.UseEndpoints(endpoints =>{
                endpoints.MapControllerRoute(
                    "abc","abc/{id}",new {controller = "ABCController",action = "GetABCService"});

              //My current endpoint mapping for the second controller:
                endpoints.MapControllerRoute(
                    "xxx","abc/{id}/xxx",new {controller = "XXXController",action = "GetXXXStatus" });
}

我不知道为什么我会通过http:// myurl / abc / 1234 / xxx获得 404 。有见识吗?

解决方法

您想说XXXController首先通过[Route("abc")]路由'abc'

[Route("abc")]
    [ApiController]
    public class XXXController : ControllerBase
    {
        [HttpGet("{id}/xxx")]
        public ActionResult<string> GetXXXService(long id)
        {
            return "ActionResult";
        }
       
    }
,

使用属性路由时,例如使用[Route][HttpGet(…)],则基于约定的路由将被忽略。因此,在为API控制器生成路由时,不会考虑用MapControllerRoute定义的路由模板。此外,使用[ApiController]属性实际上可以启用某些与API相关的约定。这些约定之一是,您只能对API控制器使用属性路由。

因此,如果您的项目中只有API控制器,则可以省去MapControllerRoute调用。相反,您必须确保属性路由正确。

在您的情况下,如果您要使用路由abc/1234/XXX,则必须使用路由abc/{id}/XXX