LinkGenerator.GetUriByAction不遵循ApiController自定义路由问题咨询
问题原因
你碰到的生成路由不符合预期的问题,主要是以下几个错误导致匹配不上你定义的属性路由,最终落到了默认传统路由规则生成URI:
- 控制器名传参错误:你的控制器类为
MarketController,路由模板中的[controller]占位符会自动解析为Market,但你调用GetUriByAction时传入的控制器名是Markets,多了后缀s,无法匹配到对应控制器的属性路由。 - Action名传参不匹配:你的Action方法名为
GetPictureAsync,你调用时传入的Action名是GetPicture,ASP.NET Core默认虽会在路由匹配时忽略Async后缀,但部分场景下会出现匹配失效的问题。 - 代码笔误:你贴出的控制器代码中,
[Route("api/[controller]")、[HttpGet("{id}/picture")两个特性都缺失了右闭合括号,会直接导致路由规则无法正常注册。
解决方法
第一步:修正控制器代码笔误
补全特性的闭合括号:
[ApiController] [Route("api/[controller]")] // 补全右括号 public class MarketController : ControllerBase { [HttpGet("{id}/picture")] // 补全右括号 public async Task<IActionResult> GetPictureAsync(Guid id) { // 你的业务代码 } }
第二步:修正路由生成调用参数
修改GetUriByAction的入参,控制器名改为Market,Action名传入完整的GetPictureAsync:
public void SomeMethod() { var uri = _linkGenerator.GetUriByAction(_httpContextAccessor.HttpContext, "GetPictureAsync", "Market", new { id = id }); }
如果你希望继续使用GetPicture作为Action名调用,可以给对应的Action方法加[ActionName]特性显式指定Action名:
[HttpGet("{id}/picture")] [ActionName("GetPicture")] public async Task<IActionResult> GetPictureAsync(Guid id) { // 你的业务代码 }
更稳定的替代方案:指定路由名称生成
属性路由场景下更推荐给路由显式指定名称,通过路由名生成URI,完全避免控制器、Action名的匹配错误:
- 给Action的HttpGet特性指定路由名:
[HttpGet("{id}/picture", Name = "GetMarketPicture")] public async Task<IActionResult> GetPictureAsync(Guid id) { // 你的业务代码 }
- 调用
GetUriByName方法生成URI:
public void SomeMethod() { var uri = _linkGenerator.GetUriByName(_httpContextAccessor.HttpContext, "GetMarketPicture", new { id = id }); }
内容的提问来源于stack exchange,提问作者Sérgio Damasceno
相关产品推荐
相关产品推荐

