【问题标题】:Web API 2 Attribute Routing ClashWeb API 2 属性路由冲突
【发布时间】:2014-05-28 20:11:02
【问题描述】:

我无法理解路线选择的工作原理。我有两个相互冲突的路由属性集。 他们是

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

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

如果我删除第二条路线,那么第一条路线可以正常工作,但否则我会得到 404。我认为路线匹配是看到一个 Guid 后跟“父母”,然后忽略了“儿童”和“儿童数据格式”应该出现在场,而是看到 3 件事跟随,所以路线 2 是匹配的。

如果这是一个正确的假设,是否有明显的解决方法可以使这项工作发挥作用?

【问题讨论】:

  • 你试过指定顺序吗?我不明白您如何获得 404,因为在最坏的情况下,如果第二条路线中的两个标记都定义为字符串,您将使用 dataSelectionTypeA = "Children"dataSelectionTypeB = "ChildrenDataFormat" 到达第二条路线。
  • 是的,我也很困惑。每个变量都是一个 Guid。我已经在不同的控制器和相同的控制器中尝试过它们,但似乎没有什么不同。如果我在任一路线中将 Parent 更改为 ParentDifferent,那么这也会使它们都起作用。

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


【解决方案1】:

奥利

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

解决方案是区分它们,您所做的是将约束添加到仅匹配的一个路由,另一种解决方案是使用顺序,因此首先使用更具体的路由(以 /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";
        }
    }
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这不是答案。这个问题没有说明。没有描述解决方案。这只是一个意外工作的黑客。
    • @MarkGreen 知道这个问题可以通过添加路由约束来解决肯定比我懒得解释我如何修复它要好。最好的猜测是 Route 不区分硬编码字符串或变量字符串。直到知道的人发现它只是......一个猜测。
    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 2020-07-23
    • 2015-11-14
    • 2013-07-10
    • 2014-03-31
    • 2013-11-11
    • 2017-09-19
    • 2014-04-19
    相关资源
    最近更新 更多