Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET WebAPI中的路由冲突_C#_Asp.net Web Api_Asp.net Web Api2_Asp.net Web Api Routing - Fatal编程技术网

C# ASP.NET WebAPI中的路由冲突

C# ASP.NET WebAPI中的路由冲突,c#,asp.net-web-api,asp.net-web-api2,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api2,Asp.net Web Api Routing,我有两个不同的控制器,每个控制器都配置了路由。为了解释我的问题,我将举例说明: 生产控制器 [Route("v1/empresas/{idConexao}/produtos/{id}")] [Route("v1/empresas/{idConexao}/produtos/categorias")] 产品分类控制器 [Route("v1/empresas/{idConexao}/produtos/{id}")] [Route(&qu

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

生产控制器

[Route("v1/empresas/{idConexao}/produtos/{id}")]
[Route("v1/empresas/{idConexao}/produtos/categorias")]
产品分类控制器

[Route("v1/empresas/{idConexao}/produtos/{id}")]
[Route("v1/empresas/{idConexao}/produtos/categorias")]
使用邮递员对路由“v1/empresas/{idConexao}/produtos/categorias”执行GET时,我收到以下错误消息:

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

但如果我对路径“v1/empresas/{idConexao}/produtos/{id}”进行注释,我可以对路径“v1/empresas/{idConexao}/produtos/categorias”进行访问,反之亦然


有人知道我如何解决这个问题吗?我认为这个错误毫无意义,问题是如果{id}属性是字符串,则两条路径都匹配相同的路由

Asp.net无法区分“类别”是id参数还是路径的一部分

要解决这个问题,您可以使用路由约束,使路径更加特殊

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

[Route("v1/empresas/{idConexao}/produtos/{id:int}")]
通过这种方式,您可以使用调用api,并且响应应该是:

  • v1/empresas/{idConexao}/produtos/categorias--Ok 200
  • v1/empresas/{idConexao}/produtos/1-->正常200
  • v1/empresas/{idConexao}/produtos/anotherString-->未找到400
您可以在此处阅读有关管线约束的内容:

我希望这是有用的


致以最诚挚的问候

,因为除非您另有说明,否则“分类”是一个完全合法的Id。查看文档:如果您的
id
始终是数字的,您可以将其标记为
[路由(“v1/empresas/{idConexao}/produtos/{id:int}”)]
,这应该允许两条路由都工作。有关其他约束类型,请参见Aluan发布的文档。只要你选择了一个“categorias”不合适的路由,它就应该可以工作。你的两个路由都可以使用相同的控制器名produtos获取http谓词。您在两个路由中指定了相同的控制器名称,这就是原因。如果您像[route(“v1/empresas/{idConexao}/produtos/{id}”)][route(“v1/empresas/{idConexao}/ProdutoCategoria/categorias”)]这样更改您的路线,这将起作用。非常感谢@BradleyUffner!您的解决方案非常有效。@AluanHaddad Haddad阅读文档后,我能够更好地理解路由限制的工作原理