多个控制器与URL WebAPI匹配

时间:2018-10-11 11:04:11

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

我有两个带有以下路由网址的Web api方法

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

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

Request /01/counter

{Id}也是一个字符串参数。因此,调用Second api时出现错误。由于webapi认为/ 01 /计数器对这两个路由均有效,因此“为此网址找到了多个控制器操作”。

我几乎没有使用regex的解决方案,但找不到可行的解决方案。有什么好的解决方案,以便两个Url都能按预期工作。

更新:

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

2 个答案:

答案 0 :(得分:0)

如果您使用的是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)]

答案 1 :(得分:0)

您的代码段没有问题。

[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 }
        );

希望它将解决您的问题。