【问题标题】:Multiple controllers match the URL WebAPI多个控制器匹配 URL WebAPI
【发布时间】:2018-10-11 11:04:10
【问题描述】:

我有两个带有以下路由 url 的 web api 方法

[HTTPGET]
[Route("{Code}/{Id}")]

[HTTPGET]
[Route("{Code}/counter")]

Request /01/counter

{Id} 也是一个字符串参数。因此,我现在在调用 Second api 时遇到错误。 “为此 URL 找到多个控制器操作”,因为 webapi 认为 /01/counter 对两个路由都有效。

我见过很少的正则表达式解决方案,但还没有找到一个可行的解决方案。有什么好的解决方案可以让两个 Url 都能按预期工作。

更新:

我发现问题正在发生,因为这两种方法位于不同的控制器中,因此 webapi 在决定选择哪个控制器时遇到问题。一旦我将它们移动到同一个控制器中,问题就解决了,因为在控制器修复后检查路由参数。

【问题讨论】:

  • 这似乎是一个设计问题,为什么不为id设置另一个级别,这样不同资源的路由就不一样了?我的意思是将[Route("{Code}/{Id}")] 替换为[Route("{Code}/Id/{Id}")]
  • 更改路线是一种选择。但可能是最后一个。因为从逻辑上讲,两者都是不同的路线。一个是有两个参数,另一个是一个。有什么解决办法。
  • 您使用的是哪个版本的 WebAPI?

标签: c# asp.net-web-api


【解决方案1】:

如果您使用的是 WebAPI 2,则可以使用 RouteOrder 属性来定义多个操作匹配时的优先级。

https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#route-order

 [HttpGet]
 [Route("{Code}/{Id}", RouteOrder = 2)]

 [HttpGet]
 [Route("{Code}/counter", RouteOrder = 1)]

如果你使用 MVC,可以使用Order 属性:

https://docs.microsoft.com/en-us/previous-versions/aspnet/mt150670(v=vs.118)

[HttpGet]
[Route("{Code}/{Id}", Order = 2)]

[HttpGet]
[Route("{Code}/counter", Order = 1)]

【讨论】:

  • 与订单结果相同
【解决方案2】:

你的sn-p代码没有问题。

[HTTPGET]
[Route("{Code}/{Id}")]

[HTTPGET]
[Route("{Code}/counter")]

您的 Web API 路由配置操作似乎没有像这样指定。这是模板提供的默认设置。

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

在 WebApi.config 文件中使用此代码

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

希望它能解决你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2016-07-27
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多