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 中的路由冲突的主要内容,如果未能解决你的问题,请参考以下文章