如何绕过异常多个操作在ASP.NET Web API中找到

cuo*_*gle 4 rest asp.net-mvc asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api

在尝试为以下问题找到解决方案时:

MVC 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的评论更新,似乎问题不正确,所以我通过不提及路由约束来改变问题的方式.

谢谢

tug*_*erk 6

首先,除非您对其应用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