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是匹配的。
如果这是一个正确的假设,是否有一个明显的解决方案来实现这一点?
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}")]