Asp.net web api 如何将具体的web.api url路由优先于抽象url路由

Asp.net web api 如何将具体的web.api url路由优先于抽象url路由,asp.net-web-api,routing,Asp.net Web Api,Routing,我有两个控制器。对于Web.API,我设置的属性路由是相同的,但其中一个具有具体的值,而另一个是标记化的。莱姆的内脏 当Url为时,我要匹配的第一个。因此,我添加了MemberProfileController并将其放在顶部: [Route("api/MemberProfile/{id:guid?}", Order = 0)] public class MemberProfileController : ApiController [Route("api/{type}/{id:guid?}",

我有两个控制器。对于Web.API,我设置的属性路由是相同的,但其中一个具有具体的值,而另一个是标记化的。莱姆的内脏

当Url为时,我要匹配的第一个。因此,我添加了MemberProfileController并将其放在顶部:

[Route("api/MemberProfile/{id:guid?}", Order = 0)]
public class MemberProfileController : ApiController
[Route("api/{type}/{id:guid?}", Order = 1)]
public class DefaultController : ApiController
然后我有了我想要匹配的抽象路由,这样Url就匹配了DefaultController,它的顶部有:

[Route("api/MemberProfile/{id:guid?}", Order = 0)]
public class MemberProfileController : ApiController
[Route("api/{type}/{id:guid?}", Order = 1)]
public class DefaultController : ApiController
我在这里留下了顺序,以表明我已经考虑了这些选项,但它只适用于同一控制器内的操作。我希望MemberProfile的具体值与第一个路由匹配,而其他任何值都与标记化路由匹配。相反,当我击中时,我得到一个警告,上面写着:

Multiple controller types were found that match the URL.

因为它同时匹配
api/MemberProfile
api/{type}
我明白了。这是有道理的,但我希望具体的价值优先。有没有办法做到这一点?有没有一种方法可以使用在配置中设置路由表的旧式方式来提供一个或另一个优先级,而不会丢失基于请求类型和参数的所有web api操作匹配魔法?

属性路由胜过WebApiConfig路由,这意味着,通过在WebApiConfig.cs
Register()
方法中添加路由而在路由表中设置的任何路由将是通过属性路由设置的任何路由的第二优先级。在这种情况下,如果您在WebApiConfig中设置了与标记化路由匹配的路由表条目,如下所示:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{type}/{id}",
    defaults: new { controller = "DefaultController", id = RouteParameter.Optional }
);
您将获得未知{type}URL的匹配,例如。这将把任何请求路由到您的DefaultController,Web API将像往常一样使用请求动词和参数匹配从那里获取路由。然后,在MemberProfileController中,按照问题所示进行设置:

[Route("api/MemberProfile/{id:guid?}", Order = 0)]
public class MemberProfileController : ApiController

现在,这将优先于在WebApiConfig.cs
Register()
方法中设置的路由,并将路由到MemberProfile控制器,但让与路由格式匹配的所有其他内容都落入您的DefaultController。

属性路由优于WebApiConfig路由,这意味着,通过在WebApiConfig.cs
Register()
方法中添加路由而在路由表中设置的任何路由将是通过属性路由设置的任何路由的第二优先级。在这种情况下,如果您在WebApiConfig中设置了与标记化路由匹配的路由表条目,如下所示:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{type}/{id}",
    defaults: new { controller = "DefaultController", id = RouteParameter.Optional }
);
您将获得未知{type}URL的匹配,例如。这将把任何请求路由到您的DefaultController,Web API将像往常一样使用请求动词和参数匹配从那里获取路由。然后,在MemberProfileController中,按照问题所示进行设置:

[Route("api/MemberProfile/{id:guid?}", Order = 0)]
public class MemberProfileController : ApiController

现在,这将优先于在WebApiConfig.cs
Register()
方法中设置的路由,并将路由到MemberProfile控制器,但让与路由格式匹配的所有其他内容都落入DefaultController。

创建自定义路由约束并将其应用于
{type}
当值为
MemberProfile时不允许匹配
我不确定这是否像我需要的那样可扩展和可管理,但这是一个选项。=]创建自定义路由约束并将其应用于
{type}
,当值为
MemberProfile
时,该约束不允许匹配。我不确定这是否具有所需的可伸缩性和可管理性,但它是一个选项。=]