找到了与URL匹配的多种控制器类型.如果多个控制器上的属性路由与请求的URL匹配,则会发生这种情

dan*_*wig 15 asp.net-mvc-controller attributerouting asp.net-mvc-5 asp.net-mvc-5.1

...猜我是第一个问这个问题的人?

假设您有以下路由,每个路由在不同的控制器上声明:

[HttpGet, Route("sign-up/register", Order = 1)]
[HttpGet, Route("sign-up/{ticket}", Order = 2)]
Run Code Online (Sandbox Code Playgroud)

...你可以在MVC 5.0中使用除Order参数之外的相同代码执行此操作.但升级到MVC 5.1后,您会在问题标题中收到异常消息:

找到了与URL匹配的多种控制器类型.如果多个控制器上的属性路由与请求的URL匹配,则会发生这种情

那么新RouteAttribute.Order属性只是控制器级别?我知道在AttributeRouting.NET中你也可以这样做SitePrecedence.当所有操作都在同一个控制器中时,是否有获得上述路由的唯一方法?

更新

对不起,我应该提到这些路由是在MVC控制器上,而不是WebAPI.我不确定这会如何影响ApiControllers.

Ton*_*res 17

如果您知道ticket将是一个,int您可以在路由中指定该类型以帮助解决路由:

[HttpGet, Route("sign-up/register")] [HttpGet, Route("sign-up/{ticket:int}")]

根据用户1145404的评论,这种方法对我有用,其中包含指向具有相同路由前缀的多个控制器类型的链接ASP.NET Web Api


Kir*_*lla 12

在属性路由的情况下,Web API尝试查找与请求匹配的所有控制器.如果它看到多个控制器能够处理这个,那么它会抛出异常,因为它认为这可能是用户错误.此路线探测与第一场比赛获胜的常规路线不同.

作为一种解决方法,如果您在同一个控制器中有这两个操作,那么Web API将遵循路由优先级,您应该看到您的方案正常工作.

  • 有没有其他方法可以做到这一点并将2个动作保存在单独的控制器中? (4认同)