我有两个带有以下路由网址的Web api方法
[HTTPGET]
[Route("{Code}/{Id}")]
[HTTPGET]
[Route("{Code}/counter")]
Request /01/counter
{Id}也是一个字符串参数。因此,调用Second api时出现错误。由于webapi认为/ 01 /计数器对这两个路由均有效,因此“为此网址找到了多个控制器操作”。
我几乎没有使用regex的解决方案,但找不到可行的解决方案。有什么好的解决方案,以便两个Url都能按预期工作。
更新:
我发现问题出在这两种方法都在不同的控制器中,因此webapi在决定选择哪个控制器时遇到了问题。一旦将它们移动到同一控制器中,就解决了问题,因为,在修复控制器后检查了路由参数。
答案 0 :(得分:0)
如果您使用的是WebAPI 2,则可以在多个操作匹配时使用RouteOrder
属性来定义优先级。
[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 }
);
希望它将解决您的问题。