Web Api获取重载引发发现与请求匹配的多个操作

时间:2015-02-28 14:18:46

标签: rest asp.net-web-api routing overloading asp.net-web-api-routing

我有一个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

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

注释掉任何一种方法都会导致对方工作。

任何帮助都将不胜感激。

1 个答案:

答案 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)
{ ... }