【问题标题】:Web Api Get Overload Throws Multiple actions were found that match the requestWeb Api Get Overload Throws 找到与请求匹配的多个操作
【发布时间】:2015-05-01 04:58:51
【问题描述】:

我有一个 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 'George' 要么 拨打http://mysite/api/users

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

注释掉其中一个方法会导致另一个工作。

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    所有的 Web API 路由都是关于将 url 转换为 controller/action。并且它的映射必须是明确的。

    如果我们只有第一个 actionGet(ODataQueryOptions&lt;ApplicationUser&gt; options),它将匹配下面的两个 url:

    http://mysite/api/users?$filter=FirstName+eq+'George' 
    http://mysite/api/users
    

    第一个url会转换成callGet(someODataValue),第二个可以是Get(null)

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

    所以解决方案通常应该是两种方法,这两种方法确实是独一无二的。例如。一个是对象/引用,第二个是 valueType/int

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

    【讨论】:

    • 如果我想要一个不带参数的get all怎么办?只是不通过选项?如果是这样,那会让 REST 专家满意吗?
    • No param... 意味着给我所有的列表(嗯,类似的东西;)。 Param INT Id 表示使用提供的密钥获取一个项目... Param as OData ... 表示给我列表,但有这些限制 ($filter,$orderby...) REST 专家会喜欢它,因为这就是它的设计方式;) 请检查此处提供的表格:en.wikipedia.org/wiki/Representational_state_transfer#Example
    猜你喜欢
    • 2016-04-08
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多