Web API中的多个GET调用错误操作

时间:2013-11-13 22:08:29

标签: c# asp.net-web-api asp.net-web-api-routing attributerouting

我有一个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之前,它工作正常。

有没有人遇到这个问题,或者你能指出我哪里出错了吗?

2 个答案:

答案 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)]