【发布时间】:2015-02-04 10:34:37
【问题描述】:
由于 API 中 JSON 数据大小写的(外部)要求(一些请求应使用 camelCasing,而其他请求应使用 PascalCasing),我将我的应用程序的一小部分的 API 拆分为两个控制器。
现在,我有一个 url,我想用 PascalCasing 映射 GET,但用 camelCasing 映射 PUT,所以我尝试了以下方法:
[PascalCasing] // custom attribute, part of our code
// We configure all controllers that *don't* have this to use
// camelCasing
public class PascalCasedController : ApiController
{
[HttpGet]
[Route("url/to/my/resource/{id}")]
public IHttpActionResult(int id)
{
return Ok(GetResource(id));
}
}
public class CamelCasedController : ApiController
{
[HttpPut]
[Route("url/to/my/resource/{id}")]
public IHttpActionResult(int id, Resource resource)
{
SaveResource(id, resource);
return Ok();
}
}
GET 请求按预期工作,但如果我尝试使用 Fiddler 向 PUT 发送某些内容,则会收到以下错误消息:
找到多个与 URL 匹配的控制器类型。如果多个控制器上的属性路由与请求的 URL 匹配,就会发生这种情况。
请求找到了以下匹配的控制器类型:
MyProject.PascalCaseController
MyProject.CamelCaseController
我意识到这可能是因为 WebAPI 先将路由映射到控制器,然后再映射操作,但如果考虑 HTTP 方法,这里确实没有任何歧义。有什么方法可以告诉 WebAPI 如何做到这一点,而不必在同一个控制器中使用这些方法?
【问题讨论】:
-
我从来没有设法解决这个问题,最终合并了两个控制器。如果有人知道如何做到这一点,我很乐意为此授予风滚草徽章!
-
这里也一样。很遗憾,因为 1 个控制器需要与另一个不同的依赖项,现在所有依赖项都注入到 1 个控制器中:-(
-
有没有人知道最后是否有办法解决这个问题?我即将合并控制器,但我想我至少会提出这个问题以防万一......
标签: asp.net-web-api attributerouting http-method