【发布时间】:2016-07-05 05:37:53
【问题描述】:
为什么这不起作用?我收到错误:System.InvalidOperationException:找到与 URL 匹配的多个控制器类型。如果多个控制器上的属性路由与请求的 URL 匹配,就会发生这种情况。
public class ConfigUpdateController: ApiController
{
[HttpPut]
[Route("api/device/{serial}/config")]
public IHttpActionResult Update(
[FromUri] string serial,
[FromBody] Configuration configuration)
{
}
}
public class ConfigQueryController: ApiController
{
[HttpGet]
[Route("api/device/{serial}/config")]
public IHttpActionResult Get(
[FromUri] string serial)
{
}
}
我想在不同的控制器中为相同资源提供方法的原因是将查询与命令分离。
编辑
老实说,这是说明我的问题的大量代码,所以请不要打扰评论控制器命名等。就我的问题而言,这并不重要。
编辑 2
我在这里找到web-api overview 路由有 3 个阶段:
路由具有三个主要阶段: 将 URI 与路由模板匹配。 选择控制器。 选择一个动作。
所以这似乎不起作用,因为控制器无法解析并且甚至没有检查方法动词(PUT,GET)? O_o
【问题讨论】:
-
方法具有相同的签名和相同的路由,这会导致问题。更改您的方法或路线的签名。使用正确的控制器命名也不会对您造成伤害。
-
你的路由不是基于控制器的
-
ASP.NET MVC 将允许您拥有两个名称相同但签名不同的操作,看看这个答案stackoverflow.com/questions/9552761/…
-
两个具有相同动作名称的方法不是我的目标。而且它不是 mvc,它是 web api。
-
嗨@hbulens 只是说可以给你的控制器起一个更好的名字作为一个好的手势,没有必要粗鲁,记住你在我认为你的问题上向我们寻求帮助可以通过简单的谷歌搜索很快得到答案。
标签: c# asp.net-web-api