【问题标题】:Query parameters override route parameters in .NET WebApi 4. How to avoid?.NET WebApi 4中的查询参数覆盖路由参数。如何避免?
【发布时间】:2013-10-25 15:49:25
【问题描述】:

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

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

当我有一个控制器时问题就开始了,它应该接受任何(零个或多个,具有随机名称)查询参数。假设它适用于 GET HTTP to 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,而不是“快乐之路”。

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

【问题讨论】:

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


    【解决方案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");
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 查询参数名称几乎是随机的。我无法控制它们。
      • 我可以重命名路由变量 id => idAndARandomString,但如果我改天得到 ?idAndARandomString=12 会怎样?
      • 尝试将 rout 定义中的“id”更改为“itemid”:routeTemplate: "api/{controller}/{itemid}/{action}",
      • 我不喜欢“重命名”解决方案:首先,我有其他控制器,其中变量名称“id”非常适合。其次,我无法控制查询参数。
      • 不幸的是,我们并不总是做我们喜欢做的事。您有两个同名的参数。我相信“我不喜欢用相同的名称命名不同的参数”会被优先录用。
      猜你喜欢
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 2013-11-26
      • 2017-04-22
      • 2018-12-28
      • 1970-01-01
      • 2018-11-12
      • 2021-08-16
      相关资源
      最近更新 更多