【问题标题】:How to bypass the exception multiple actions were found in ASP.NET Web API如何绕过在 ASP.NET Web API 中发现多个操作的异常
【发布时间】:2012-07-29 04:06:17
【问题描述】:

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

MVC Web Api Route with default action not working

大多数情况下,我都会遇到“找到多个操作”的问题。如果路由机制发现多个动作与路由匹配,则抛出异常 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: 从 Mike 的评论中更新,似乎问题不太正确,所以我改变了提问的方式,没有提及路由约束。

谢谢

【问题讨论】:

  • 嗯,除非您在其上应用HttpGet 属性,否则这些路由应该不可能匹配 Active 操作。
  • 我已更新问题以添加 HttpGet 属性

标签: asp.net-mvc rest asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api


【解决方案1】:

首先,除非您在其上应用 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 的人请求:

GET /controllername/retrieve

GET /controllername/active

【讨论】:

  • 感谢您的回答,是的,我知道默认路由框架基本上不支持这个,我正在努力寻找解决方法。你的假设当然是完美的。但我在想我们是否可以在这里应用 Route Constraint
  • 但在您的示例中,这两个操作都映射到“GET api/values”。路由约束确定给定的 URI 是否与模板匹配。它要么匹配,要么不匹配。只有在路由匹配后才会选择该操作。如果两个操作具有相同的参数签名和相同的 HTTP 方法,并且您没有使用基于操作的路由,那么它们必然是不明确的。
  • 感谢 Mike 的评论,我明白了你的意思,如果我们不能像你提到的那样使用路由约束,有没有什么方法可以通过选择指定的操作或第一个操作来避免抛出异常?
  • 那么下一个问题是:您希望您的 URI 看起来像什么?如果“api/values”应该选择第一个动作,你想要另一个动作的 URI 是什么? (我不太确定你想做什么......)
猜你喜欢
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多