我有一个api控制器:
[RoutePrefix("api/users")]
[Authorize]
public class UsersController : ApiController
有两个Get方法:
[HttpGet]
[Route("")]
public async Task<HttpResponseMessage> Get(ODataQueryOptions<ApplicationUser> options)
{
return Request.CreateResponse(HttpStatusCode.OK, new List<ApplicationUser>());
}
[HttpGet]
[Route("")]
public async Task<HttpResponseMessage> Get()
{
return Request.CreateResponse(HttpStatusCode.OK, new List<ApplicationUser>());
}
拨打http://mysite/api/users?$ filter = FirstName eq&#39; George&#39; 要么 致电http://mysite/api/users
导致异常找到与请求匹配的多个操作。
注释掉任何一种方法都会导致对方工作。
任何帮助都将不胜感激。
答案 0 :(得分:0)
所有Web API路由都是关于将url
转换为controller/action
。它的映射必须是明确的。
如果我们只有第一个操作Get(ODataQueryOptions<ApplicationUser> options)
,它会匹配以下两个网址:
http://mysite/api/users?$filter=FirstName+eq+'George'
http://mysite/api/users
第一个网址将转换为通话Get(someODataValue)
,第二个网址可能会转为Get(null)
同样可以应用于没有参数的第二个方法Get()
,因为两个网址都将转换为无参数调用Get()
(将跳过OData部分)
所以解决方案通常应该是两种方法,这些方法在params中是独一无二的。例如。一个是object / refence,第二个是valueType / int
[HttpGet]
public async Task<HttpResponseMessage> Get(ODataQueryOptions<ApplicationUser> options)
{ ... }
[HttpGet]
public async Task<HttpResponseMessage> Get(int id)
{ ... }