Asp.Net Core Web API新增Get方法报404错误求助
这个问题其实是Asp.Net Core路由系统和旧版Web API的差异导致的,咱们一步步拆解清楚:
问题根源
你的控制器已经标注了[Route("api/MyController")],这意味着控制器内所有方法的路由都会自动拼接这个前缀。而你给方法加的[Route("api/MyNewMethodName")]是相对路由,最终组合后的完整路由是:api/MyController/api/MyNewMethodName
但你调用的地址是myURL/api/MyNewMethodName,完全不匹配,自然返回404。旧版Web API的路由处理逻辑更宽松,允许这种写法,但Core的路由是严格的前缀拼接规则。
几种可行的解决方案
方案1:使用相对路由(推荐,符合Core路由规范)
修改方法上的Route特性,去掉api/前缀,让它和控制器的前缀正常拼接:
[HttpGet] [Route("MyNewMethodName")] public object MyNewMethodName(string parameter1) { // 你的业务逻辑 }
对应的调用地址要调整为:myURL/api/MyController/MyNewMethodName?parameter1=somestring
你也可以用更简洁的写法,把HttpGet和路由模板合并:
[HttpGet("MyNewMethodName")] public object MyNewMethodName(string parameter1) { // 你的业务逻辑 }
方案2:使用绝对路由(保持原有调用地址)
如果你想完全保留原来的调用地址不变,可以给方法的Route加上开头的斜线,让它成为绝对路由,这样会忽略控制器的路由前缀:
[HttpGet] [Route("/api/MyNewMethodName")] public object MyNewMethodName(string parameter1) { // 你的业务逻辑 }
这样你原来的调用地址myURL/api/MyNewMethodName?parameter1=somestring就能正常访问了。
额外提示
如果遇到参数无法绑定的情况,可以给参数加上[FromQuery]特性明确指定从QueryString获取:
public object MyNewMethodName([FromQuery] string parameter1) { // 你的业务逻辑 }
不过对于简单的string类型,Core默认会自动从QueryString绑定,这个一般不是问题,但遇到复杂场景时可以用上。
内容的提问来源于stack exchange,提问作者GCoe

