我有两个控制器。对于Web.API,我设置的属性路由是相同的,但是一个具有具体值而另一个具有标记化。 Lemme' splain。
第一个我希望在网址为http://localhost/MemberProfile时匹配。所以,我添加一个MemberProfileController并将其放在顶部:
[Route("api/MemberProfile/{id:guid?}", Order = 0)]
public class MemberProfileController : ApiController
然后我想要匹配抽象路线,以便Url http://localhost/City匹配DefaultController,它在顶部有这个:
[Route("api/{type}/{id:guid?}", Order = 1)]
public class DefaultController : ApiController
我已经将Order留在那里以表明我已经考虑了这些选项,但它仅适用于同一控制器内的操作。我希望MemberProfile的具体值与第一条路线匹配,而任何其他值与标记化路线匹配。相反,当我点击http://localhost/MemberProfile时,我会收到一条警告:
Multiple controller types were found that match the URL.
因为它匹配api/MemberProfile
和api/{type}
我得到了它。这是有道理的,但我希望具体的价值优先。有没有办法实现这个目标?有没有办法在配置中使用旧样式设置路由表来给出一个或另一个优先级,而不会丢失所有基于请求类型和参数匹配魔法的web api动作?
答案 0 :(得分:0)
属性路由胜过WebApiConfig路由,这意味着您通过在WebApiConfig.cs Register()
方法中添加它们而在路由表中设置的任何路由将是您通过属性路由设置的任何路由的第二优先级。在这种情况下,如果您在WebApiConfig中设置与您的标记化路由匹配的路由表条目,如下所示:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{type}/{id}",
defaults: new { controller = "DefaultController", id = RouteParameter.Optional }
);
您可以使用http://localhost/City等未知{type}网址进行匹配。这将把任何请求路由到DefaultController,Web API将使用请求动词和参数匹配从那里获取路由。然后,在MemberProfileController中,按照问题所示进行设置:
[Route("api/MemberProfile/{id:guid?}", Order = 0)]
public class MemberProfileController : ApiController
现在,这将优先于WebApiConfig.cs Register()
方法中设置的路由,http://localhost/MemberProfile将路由到MemberProfile控制器,但让符合路由格式的所有其他内容都会落到您的DefaultController。