Rest Web Api Get Overload抛出多个与请求匹配的操作

Rest Web Api Get Overload抛出多个与请求匹配的操作,rest,asp.net-web-api,routing,overloading,asp.net-web-api-routing,Rest,Asp.net Web Api,Routing,Overloading,Asp.net Web Api Routing,我有一个api控制器: [RoutePrefix("api/users")] [Authorize] public class UsersController : ApiController 这有两种获取方法: [HttpGet] [Route("")] public async Task<HttpResponseMessage> Get(ODataQueryOptions<ApplicationUser> options) { return Reque

我有一个api控制器:

[RoutePrefix("api/users")]
[Authorize]
public class UsersController : ApiController
这有两种获取方法:

[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>());
}
[HttpGet]
[路线(“”)
公共异步任务获取(ODataQueryOptions?$filter=FirstName eq'George'
或
召唤

导致异常的原因找到了多个与请求匹配的操作

注释掉任何一种方法都会导致另一种方法起作用


任何帮助都将不胜感激。

所有Web API路由都是关于将
url
转换为
controller/action
。其映射必须明确无误

如果我们只有第一个操作
Get(ODataQueryOptions选项)
,它将匹配以下两个URL:

http://mysite/api/users?$filter=FirstName+eq+'George' 
http://mysite/api/users
第一个url将转换为call
Get(someODataValue)
,第二个url可以是
Get(null)

不带参数的第二个方法
Get()
,也可以采用同样的方法,因为两个URL都将转换为无参数调用
Get()
(OData部分将被跳过)

因此,解决方案通常应采用两种方法,这两种方法的参数都是唯一的。例如,一种是object/refence,另一种是valueType/int

[HttpGet]
public async Task<HttpResponseMessage> Get(ODataQueryOptions<ApplicationUser> options)
{ ... }

[HttpGet]
public async Task<HttpResponseMessage> Get(int id)
{ ... }
[HttpGet]
公共异步任务获取(ODataQueryOptions选项)
{ ... }
[HttpGet]
公共异步任务Get(int-id)
{ ... }

那么,如果我想要一个没有参数的“全部获取”(get all)怎么办?只是不传递选项?如果是的话,这会满足其他专家的要求吗?没有参数…意味着给我所有的列表(嗯,类似于;)。参数INT Id意味着用提供的键获取一个项目…参数作为OData…意味着给我列表,但有这些限制($filter,$orderby…)REST大师会喜欢它的,因为它就是这样设计的;)请检查这里提供的表格: