我遇到了一个路由设置不正确的问题,我已经修复了这个问题,但我不完全理解为什么修复有效。
[ApiController]
[Route("api/[controller]")
public class DetailsController : ControllerBase
{
[HttpGet]
[Route("api/[controller]/{transactNo}")]
public IActionResult Detail(int transactNo)
{
...
当我调用api/details/123
时,我得到的路由找不到,直到我从类中删除了Route
属性。所以我想他们是矛盾的,但为什么呢?
在控制器上放置RouteAttribute
与在操作上放置不同。
- 在控制器上,它定义了属于该控制器的所有操作都将以其为前缀的路由
- 在操作中,它定义要与带前缀的路由连接的路由
这意味着当您添加这两个属性时,您可以在以下位置调用操作:
https://localhost:44338/api/details/api/details/1
^^^^^^^^^^^ ^^^^^^^^^^^^^
from controller ^
from action
端点的路由是控制器的路由api/[controller]
与操作的路由api/[controller]/{transactNo}
。
在您的情况下,端点的路由是api/[controller]/api/[controller]/{transactNo}
。
你需要简化行动的路线,比如:
[HttpGet]
[Route("{transactNo}")]
public IActionResult Detail(int transactNo)
{
如果只想从操作重新定义端点的路由,则操作的路由必须以/
:开始
[HttpGet]
[Route("/api/[controller]/{transactNo}")]
public IActionResult Detail(int transactNo)
{
您可以将操作中的路由属性替换为[HttpGet("{transactNo}")]
,并将控制器上的路由属性更改为[Route("api/[controller]/[action]")]
[ApiController]
[Route("api/[controller]/[action]")]
public class DetailsController : ControllerBase
{
[HttpGet("{transactNo}")]
public IActionResult Detail(int transactNo)
{
...
}
}
现在你可以调用这个url:api/Details/Detail/123