问题描述
我正在使用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
。