4

当试图为以下问题寻找解决方案时:

具有默认操作的 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" };
}

与默认路由匹配:

 routes.MapHttpRoute(
          name: "DefaultApi",
          routeTemplate: "api/{controller}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );

GET: /api/values 

发现多个操作会出错。

我的问题:如何通过选择指定的操作绕过异常“找到多个操作”(选择第一个匹配的操作也可以)。

更新 1:更新来自 tugberk 的评论,感谢指出。

更新2:从迈克的评论更新,似乎这个问题不太正确,所以我改变了提问的方式,没有提到路由约束。

谢谢

4

1 回答 1

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" };
}

您的路线应如下所示:

routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

然后,您可以向具有以下 URI 的人请求:

获取/控制器名称/检索

获取/控制器名称/活动

于 2012-07-31T12:39:36.720 回答