查询参数将覆盖 .NET WebApi 4 中的路由参数.如何避免

本文关键字:参数 路由 何避免 WebApi 覆盖 NET 查询 | 更新日期: 2023-09-27 18:36:51

我或多或少有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,而不是"快乐之路"。

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

查询参数将覆盖 .NET WebApi 4 中的路由参数.如何避免

为了避免这种情况,我添加了一个签入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=3" 的名称更改为 "otherId=3"