cuo*_*gle 4 rest asp.net-mvc asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api
在尝试为以下问题找到解决方案时:
大多数情况下,我遇到了"发现多个动作"的问题.如果路由机制发现多个与路由匹配的操作,则会抛出异常500.
例如,ValuesController中有两个操作:
[HttpGet]
public IEnumerable<String> Active()
{
var result = new List<string> { "active1", "active2" };
return result;
}
public IEnumerable<string> Get()
{
return new[] { "value1", "value2" };
}
Run Code Online (Sandbox Code Playgroud)
与默认路由匹配:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
同
GET: /api/values
Run Code Online (Sandbox Code Playgroud)
将发现错误多个动作被发现.
我的问题:如何通过选择指定的操作来绕过异常"找到多个动作"(选择第一个匹配的动作也没关系).
更新1:从tugberk的评论更新,感谢指出.
更新2: Mike的评论更新,似乎问题不正确,所以我通过不提及路由约束来改变问题的方式.
谢谢
首先,除非您对其应用HttpGet属性,否则这些路径不应该与Active动作匹配.我会假设你已经这样做了.第二件事是你想要的不合逻辑.您想提出获取请求并执行两个相同的操作.您现在正在使用所谓的基于HTTP方法的路由.对于你的情况,我确信所谓的基于行动的路由是最好的.
假设你有以下两个动作:
[HttpGet]
public IEnumerable<String> Active()
{
var result = new List<string> { "active1", "active2" };
return result;
}
[HttpGet]
public IEnumerable<string> Retrieve()
{
return new[] { "value1", "value2" };
}
Run Code Online (Sandbox Code Playgroud)
你的路线应该如下:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
然后,您可以请求具有以下URI的人:
GET/controllername/retrieve
GET/controllername/active