我有一个Web API
,看起来如下......
public class LeaguesController : ApiController
{
//api/Leagues/active/1
//api/Leagues/complete/1
//api/Leagues/both/1
[GET("api/Leagues/{type}/{id}")]
public List<Competition> Get([FromUri]int id,
[FromUri]CompetitionManager.MiniLeagueType type)
{
return CompetitionManager.GetUsersMiniLeagues(id, true, type);
}
//api/Leagues/GetMiniLeagueTable/3
[GET("api/Leagues/GetMiniLeagueTable/{id}")]
public List<SportTableRow> GetMiniLeagueTable([FromUri]int id)
{
return SportManager.GetMiniLeagueTable("", id).TableRows;
}
}
当我调用第一个方法Get
时,这很好用。
当我使用fiddler或Chrome REST Client调用第二种方法GetMiniLeagueTable
时,我收到以下错误:
{消息:“请求无效。” MessageDetail:“参数 dictionary包含非可空参数'type'的null条目 输入'CompetitionManager + MiniLeagueType'作为方法 'System.Collections.Generic.List`1 [竞赛]获取(Int32, MiniLeagueType)'in'LeaguesController'。必须是可选参数 引用类型,可空类型,或声明为可选类型 参数。“}
我正在使用AttributeRouting
来修饰方法,但这似乎不起作用。在我介绍MiniLeagueType
之前,它工作正常。
有没有人遇到这个问题,或者你能指出我哪里出错了吗?
答案 0 :(得分:5)
我认为原因是这个网址:api/Leagues/GetMiniLeagueTable/3
。此URL匹配两个路由,因为它可以解释为:api/Leagues?type=GetMiniLeagueTable&id=3
。但它无法将GetMiniLeagueTable
转换为CompetitionManager.MiniLeagueType
值,因此会引发错误。
您应该制作更具体的路线,例如api/Leagues/GetCompetitions/{type}/{id}
,以防止网址匹配2条或更多条不同的路线。
另一种可能性是颠倒你的行动指令,因为如果网址不匹配,它将在下一行之前检查第一行动的路线。
答案 1 :(得分:3)
看起来网址:/ api / Leagues / GetMiniLeagueTable / 3会匹配这两条路线。
假设它匹配第一条路线,那么它将无法将GetMiniLeagueTable转换为CompetitionManager.MiniLeagueType,除非这是一个有效的枚举值。
您可能需要首先测试第二条路线,并且只有当它与网址不匹配时,请尝试第二条路线。
我自己没有使用过attributerouting(虽然我在最新的web api中使用了类似的属性路由)但我猜测ActionPrecedence会有所帮助。
尝试
[GET("api/Leagues/{type}/{id}", ActionPrecedence = 2)]
和
[GET("api/Leagues/GetMiniLeagueTable/{id}", ActionPrecedence = 1)]