C# 查询参数覆盖.NET WebApi 4中的路由参数。如何避免?

C# 查询参数覆盖.NET WebApi 4中的路由参数。如何避免?,c#,asp.net-web-api,routing,C#,Asp.net Web Api,Routing,我或多或少有webapi的标准路由(除了我添加了{action}): 当我有一个控制器时,问题就开始了,它应该接受任何(零个或更多,带有随机名称)查询参数。假设它与GET HTTP to URL一起工作,如: /api/Data/2836581?id=3&name=lol&etc=23&filter=all_but_nice 在Get(intid)控制器方法中,我接收id==3,而我期望id==2836581 我可以使用以下方法绕过此问题: Request.GetRou

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

当我有一个控制器时,问题就开始了,它应该接受任何(零个或更多,带有随机名称)查询参数。假设它与GET HTTP to URL一起工作,如:

/api/Data/2836581?id=3&name=lol&etc=23&filter=all_but_nice
在Get(intid)控制器方法中,我接收id==3,而我期望id==2836581

我可以使用以下方法绕过此问题:

Request.GetRouteData().Values["id"]; // 2836581
Request.GetQueryNameValuePairs(); // All query parameters
但这种解决方案更像是一种黑客行为,而不是“快乐之路”


我可以让WebApi将路由变量优先于url查询参数吗?

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

为了避免这种情况,我添加了一个签入
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");
    }
}

查询参数的名称几乎是随机的。我无法控制它们。我可以重命名路由变量id=>IDandrandomstring,但如果我改天得到?IDandrandomstring=12会发生什么?尝试将路由定义中的“id”更改为“itemid”:routeTemplate:“api/{controller}/{itemid}/{action}”,我不喜欢“重命名”解决方案:首先,我有其他控制器,其中变量名为“id”非常合身。其次,我无法控制查询参数。不幸的是,我们并非总是做我们喜欢的事情。您有两个同名的参数。我相信“我不喜欢用同一个名字来命名不同的参数”会出现在优先列表中。
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");
    }
}