You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OWIN+TopShelf搭建WebApi遇路由匹配失败问题求助

解决Web API路由不匹配的问题

看起来你遇到的是典型的路由匹配问题,我帮你拆解几个容易忽略的小错误:

问题1:路由模板的末尾斜杠不匹配

你的Web API路由模板写的是:

routeTemplate: "api/{controller}/{action}/",

注意末尾多了一个斜杠,而你发起请求的URL是http://localhost/myapp/api/data/abc(末尾没有斜杠)。虽然Web API有一定容错性,但这种微小的不一致很容易导致路由匹配失败。

修复方案:把路由模板的末尾斜杠去掉,改成:

routeTemplate: "api/{controller}/{action}",

问题2:参数传递方式不对

你的DataController里的Abc方法需要一个text参数,但你当前的请求URL既没把它作为路由的一部分,也没通过查询字符串传递。Web API找不到匹配的动作,本质是因为它无法解析你需要的参数。

两种正确的调用方式:

  1. 通过查询字符串传递参数(无需修改路由)
    直接在URL末尾加上?text=你的内容,比如:

    http://localhost/myapp/api/data/abc?text=hello-world
    
  2. 把参数加入路由模板(如果想让参数出现在路径里)
    修改路由模板,把text参数加进去:

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{text}",
        defaults: new {}
    );
    

    之后就可以这样调用:

    http://localhost/myapp/api/data/abc/hello-world
    

额外优化建议

为了让代码可读性更强,你可以给Abc方法的参数加上[FromUri]特性,明确指定参数从URI获取(虽然GET请求下简单类型默认就是从URI取,但加上后逻辑更清晰):

[HttpGet]
public string Abc([FromUri] string text)
{
    var name = GetType().Name;
    return $"{name} pings back «{text}»";
}

按照上面的步骤调整后,你的API应该就能正常响应了。

内容的提问来源于stack exchange,提问作者Lotok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:49:36