Web API 2属性路由冲突

本文关键字:路由 冲突 属性 API Web | 更新日期: 2023-09-27 17:58:13

我在了解路线选择的工作原理时遇到了问题。我有两个路线属性集,它们相互冲突。他们是

[Route("{apikey}/Parent/{parentID}/Children/ChildrenDataFormat")]
[Route("{apikey}/Parent/{parentID}/{dataSelectionTypeA}/{dataSelectionTypeB}")]

第一条路线的最后两部分是硬编码的,永远不会改变。第二个路由将绑定到方法参数中。

如果我删除第二条路线,那么第一条路线运行良好,否则我会得到404。我认为路由匹配是看到一个Guid后面跟着"Parent",然后忽略了"Children"answers"ChildrenDataFormat"应该存在的事实,而是看到3个东西跟着,所以路由2是匹配的。

如果这是一个正确的假设,是否有一个明显的解决方案来实现这一点?

Web API 2属性路由冲突

Oli

由于两条管线都是属性管线,因此它们没有隐式顺序,因为它们都具有相同数量的路径段,因此都会匹配,从而导致歧义。

解决方案是区分它们,您所做的是只向其中一个匹配的路由添加约束,另一个解决方案是使用order,因此首先选择更具体的路由(以/Children/ChildrenDataFormat结尾的路由)。

这里有一个简单的例子,显示了订单和路线值是如何捕获的

public class ValuesController : ApiController
{
    [Route("api/values/MyName", Order = 1)]
    [Route("api/values/{name}", Order = 2)]
    public string Get()
    {
        object nameObj;
        Request.GetRouteData().Values.TryGetValue("name", out nameObj);
        if (nameObj != null)
        {
            // came from second route
            return "Route is {name} and name was: " + (string) nameObj;
        }
        else
        {
            return "Route is MyName so no name value is available";
        }
    }
}

我仍然不确定确切的问题是什么,但我已经通过向所有变量添加路由约束来解决了它。我的路线现在看起来像

[Route("{apikey:guid}/Parent/{parentID:guid}/Children/ChildrenDataFormat")]
[Route("{apikey:guid}/Parent/{parentID:guid}/{dataSelectionTypeA:guid}/{dataSelectionTypeB:guid}")]