【发布时间】:2018-12-06 16:37:45
【问题描述】:
在一个 webapi 项目的 WebAPIConfig.cs 中,添加了 2 个路由
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我尝试创建一个包含以下功能的 apiController
[HttpGet]
public string Get(int id)
{
return "get";
}
[HttpGet]
[ActionName("ByWait")]
public string[] ByWait(int id)
{
return "bywait";
}
我希望 请求 /api/controllername/1234 返回“get”,并且 请求 /api/controllername/bywait/1234 返回“bywait”。
但是,实际结果是 /api/controllername/1234 >> throw exception 找到与请求匹配的多个操作 /api/controllername/bywait/1234 >> “等待”
但是可以解决问题吗? s.t如何限制函数ByWait只接受包含动作的请求,使其只响应/api/controllername/bywait/1234并忽略/api/controllername/1234
或者有其他更好的解决方案?
谢谢
【问题讨论】:
-
“DefaultApi”路由配置应该在最后。这样特定的路由评估发生在默认路由映射之前。尝试在路由映射代码中将
DefaultApi放在ActionApi之后。 -
如果我改变 Maphttproute 的顺序。我什至无法成功调用 /api/controllername/1234,它抛出异常显示 1234 不是有效的操作名称
标签: c# asp.net-web-api