我的第一个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()
我做错了什么?
答案 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;
}
如果您想了解有关此路由规则的更多信息,请参阅此类文章;