ASP.NET WebAPI 中的路由冲突

Posted

技术标签:

【中文标题】ASP.NET WebAPI 中的路由冲突【英文标题】:Route conflict in ASP.NET WebAPI 【发布时间】:2020-12-23 06:26:03 【问题描述】:

我有两个不同的控制器,每个控制器都有其配置的路由。为了解释我的问题,我将举例说明:

产品控制器

[Route("v1/empresas/idConexao/produtos/id")]

ProdutoCategoriaController

[Route("v1/empresas/idConexao/produtos/categorias")]

使用邮递员对“v1/empresas/idConexao/produtos/categorias”路线执行 GET 时,我收到以下错误消息:

找到多个与 URL 匹配的控制器类型。如果多个控制器上的属性路由与请求的 URL 匹配,就会发生这种情况

但是,如果我对路线“v1/empresas/idConexao/produtos/id”发表评论,我可以在路线“v1/empresas/idConexao/produtos/categorias”上进行评论,反之亦然。

有谁知道我该如何解决这个问题?我认为这个错误没有意义

【问题讨论】:

因为"categorias" 是一个完全合法的 ID,除非您另外指定。查看文档:docs.microsoft.com/en-us/aspnet/web-api/overview/… 如果您的id 始终是数字,您可以将其标记为[Route("v1/empresas/idConexao/produtos/id:int")],这应该允许两个路由都工作。有关其他约束类型,请参阅 Aluan 发布的文档。只要您选择“类别”不适合的一个,它就可以工作。 您的两条路线都在工作,在相同的控制器名称产品中获取 http 动词。您在两条路线中都指定了相同的控制器名称,这就是原因。如果您更改路线,例如 [Route("v1/empresas/idConexao/produtos/id")] [Route("v1/empresas/idConexao/ProdutoCategoria/categorias")] @AluanHaddad Haddad 阅读文档我能够更好地理解路线限制的工作原理 很高兴这很有用。有很多方法可以完成这项工作,我不想在没有更多信息(例如 Id 的类型)的情况下随意推荐一种。 【参考方案1】:

如果 id 属性是一个字符串,问题是两个路径匹配相同的路由。

Asp.net 不能区分“类别”是 id 参数或路径的一部分

为了解决这个问题,您可以使用路线约束,来制作更具体的路径。

例如,您可以定义参数 id 的类型,如 int 或 guid。

[Route("v1/empresas/idConexao/produtos/id:int")]

这样你可以调用 api 并且响应应该是那些:

v1/empresas/idConexao/produtos/categorias -- 好的 200 v1/empresas/idConexao/produtos/1 --> OK 200 v1/empresas/idConexao/produtos/anotherString --> NotFound 400

您可以在此处阅读有关路线限制的信息:https://docs.microsoft.com/es-es/aspnet/core/fundamentals/routing?view=aspnetcore-3.1#route-constraint-reference

希望对你有用!

最好的问候

【讨论】:

以上是关于ASP.NET WebAPI 中的路由冲突的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET WebApi 中路由相关实体的最佳实践是啥

ASP .NET WebAPI 路由数据架构

ASP.net MVC 4 WebApi 中的嵌套资源

asp.net webapi 2属性路由不起作用

ASP.NET Web Api 路由自定义

ASP.NET WebApi 从入门到"放弃"系列---WebApi 请求路由