使用ActionNameAttribute的ApiController接口无法被找到的问题
解决ASP.NET Core中ActionNameAttribute导致API端点无法识别的问题
你的问题出在ActionNameAttribute仅用于给动作方法设置别名,不会自动修改路由模板。当你把[HttpGet("FrontendVersionWRV")]改成[HttpGet]+[ActionName("FrontendVersionWRV")]后,该动作的路由变成了控制器级别的默认路由api/LLWebReportViewer,而原来的请求路径api/LLWebReportViewer/FrontendVersionWRV不再匹配任何端点,因此会提示找不到方法。
结合你无法仅使用HttpGetAttribute的限制,以下是可行的解决方案:
方案1:在HttpGetAttribute中指定ActionName值
同时保留[HttpGet]和[ActionName],并在HttpGet中显式指定路径(与ActionName一致),这样既能满足第三方库对ActionName的要求,又维持原路由:
[Route("api/[controller]")] [ApiController] [AllowAnonymous] [ApiExplorerSettings(IgnoreApi = true)] public class LLWebReportViewerController : ControllerBase { [HttpGet("FrontendVersionWRV")] [ActionName("FrontendVersionWRV")] public bool FrontendVersionWRV(string frontendVersion) { // ... do something return true; } }
方案2:修改控制器路由模板包含[action]
如果控制器仅包含这一个动作,或者希望所有动作都使用ActionName作为路由段,可以修改控制器的Route属性,加入[action]占位符,这样ActionName的值会自动作为路由的一部分:
[Route("api/[controller]/[action]")] // 新增[action]占位符 [ApiController] [AllowAnonymous] [ApiExplorerSettings(IgnoreApi = true)] public class LLWebReportViewerController : ControllerBase { [HttpGet] [ActionName("FrontendVersionWRV")] public bool FrontendVersionWRV(string frontendVersion) { // ... do something return true; } }
此时请求路径仍为api/LLWebReportViewer/FrontendVersionWRV,与原路径一致。
方案3:给Action添加独立的RouteAttribute
在Action上额外添加[Route]属性,指定路由路径,与ActionName保持一致:
[Route("api/[controller]")] [ApiController] [AllowAnonymous] [ApiExplorerSettings(IgnoreApi = true)] public class LLWebReportViewerController : ControllerBase { [HttpGet] [ActionName("FrontendVersionWRV")] [Route("FrontendVersionWRV")] // 显式指定路由段 public bool FrontendVersionWRV(string frontendVersion) { // ... do something return true; } }
以上三种方案都能让API识别带ActionNameAttribute的端点,其中方案1是最贴近你原有代码结构的选择。
内容的提问来源于stack exchange,提问作者BennoDual
相关产品推荐
相关产品推荐

