查询参数覆盖.NET Web Api中的路由参数4.如何避免?

时间:2013-10-25 15:49:25

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

我有更多或更少的webapi标准路线(除了我添加{action}):

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}/{action}",
            defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional }
        );

问题开始时我有一个控制器,它应该接受任何(零个或多个,随机名称)查询参数。假设它适用于GET HTTP到URL,如:

/api/Data/2836581?id=3&name=lol&etc=23&filter=all_but_nice

在Get(int id)控制器方法中,我收到id == 3,而我期望id == 2836581。

我可以使用以下方法绕过这个:

Request.GetRouteData().Values["id"]; // 2836581
Request.GetQueryNameValuePairs(); // All query parameters

但是这种解决方案更像是HACK而不是“快乐路径”。

我可以通过url-query params使WebApi优先处理路由变量吗?

2 个答案:

答案 0 :(得分:1)

为了避免这种情况,我在AuthorizationFilterAttribute中添加了一个检查来拒绝此类请求。

private static void dedupQuery( HttpActionContext actionContext)
{
    var routeData = actionContext.Request.GetRouteData().Values;
    var queryString = actionContext.Request.GetQueryNameValuePairs().ToDictionary(x => x.Key, x => x.Value);
    if( queryString.Keys.Any(s => routeData.Keys.Contains(s)))
    {
        throw new HttpException((int)HttpStatusCode.Conflict, "DUPLICATED PARAM");
    }
}

答案 1 :(得分:0)

尝试将参数“id = 3”的名称更改为“anotherId = 3”