为什么我不会调用Web API路由到正确的方法?

时间:2014-09-26 15:51:29

标签: asp.net-web-api

我的第一个Web API工作正常,但即使我调用它并传递一个id也会被路由到没有参数的方法。

这是我的控制器代码:

public class ChartController : ApiController
{
    Chart[] _charts = new Chart[] 
    { 
        new Chart { Name = "Chart 1" }, 
        new Chart { Name = "Chart 2" }, 
        new Chart { Name = "Chart 3" }
    };

    // GET api/chart
    [Route("api/chart")]
    public IEnumerable<Chart> Get()
    {
        return _charts;
    }

    // GET api/chart/{id}
    [Route("api/chart/{id}")]
    public IEnumerable<Chart> Get(int chartId)
    {
        Chart[] charts = new Chart[]
        {
            Charts.Database.ChartsDB.GetChart(chartId)
        };

        return charts;
    }

}

这是我在global.asax

中的路由
        RouteTable.Routes.MapHttpRoute(
            name: "ChartApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = System.Web.Http.RouteParameter.Optional }
            );

这是我的要求uri

http://localhost:42311/api/chart

结果

[
{
    "Name": "Chart 1"
},
{
    "Name": "Chart 2"
},
{
    "Name": "Chart 3"
}

当我将uri更改为

http://localhost:42311/api/chart/1

我得到相同的结果,因为两个呼叫都被路由到

public IEnumerable<Chart> Get()

我做错了什么?

1 个答案:

答案 0 :(得分:1)

  

请注意 WebApi 基于反射工作,这意味着您的花括号{vars}必须与您的方法中的相同名称匹配。

因此,要匹配此api/chart/{id},您的方法需要声明如下:

   [Route("api/chart/{chartId}"), HttpGet]
   public IEnumerable<Chart> Get(int chartId)
       return userId;
   }

参数{id}chartId替换。

另一种选择可以是:

 [Route("api/chart/{id}"), HttpGet]
 public IEnumerable<Chart> Get(int id)
   return userId;
 }

如果您想了解有关此路由规则的更多信息,请参阅此类文章;

WebApi Routing Configuration