Web API 2属性路由冲突

时间:2014-04-14 18:21:12

标签: c# asp.net-mvc-5 asp.net-web-api-routing asp.net-web-api2

我在解决路线选择的工作方式时遇到了问题。我有两个路由属性设置相互冲突。 他们是

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

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

如果我删除了第二条路线,那么第一条路线工作正常,否则我得到一条404.我认为路线匹配是看到一个Guid后跟“Parent”,然后忽略了“Children”和“ChildrenDataFormat”应该这样的事实出现,而不是看到3件事情,所以路线2是匹配。

如果这是一个正确的假设并且有明显的解决方法可以使这项工作吗?

2 个答案:

答案 0 :(得分:0)

奥利

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

解决方案是区分它们,你所做的只是为一条路线匹配添加约束,另一种解决方案是使用顺序,所以首先是更具体的路线(以/ Children / ChildrenDataFormat结尾的路线)。 / p>

这是一个简单的示例,显示了顺序以及如何捕获路由值

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";
        }
    }
}

答案 1 :(得分:-2)

我仍然不确定究竟是什么问题但是我已经设法通过向我的所有变量添加路由约束来修复它。 I.E我的路线现在看起来像

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