【问题标题】:Route conflict in ASP.NET WebAPIASP.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 的类型)的情况下随意推荐一种。

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


【解决方案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

希望对你有用!

最好的问候

【讨论】:

    猜你喜欢
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多