如何在ASP.NET Core中间器重写查询字符串:短横线键转驼峰
ASP.NET Core 无重定向重写:将短横线查询键转为驼峰命名
需求很明确:把请求里的短横线命名(kebab-case)查询参数键,转换成驼峰命名(camelCase),而且不能重定向用户,只需要在请求管道内部修改上下文。
你现在的代码已经走对了第一步——拿到查询集合并转换了键名,但问题出在不知道怎么正确构建新的查询串并替换到请求里。直接给你修正后的完整代码:
app.Use(async (context, next) => { // 初始化QueryBuilder用来构建新的查询键值对 var queryBuilder = new QueryBuilder(); foreach (var item in context.Request.Query) { // 将短横线命名的键转为驼峰(这里假设你用的Humanizer库的Underscore+Camelize方法) var camelizedKey = item.Key.Underscore().Camelize(); // 把转换后的键和原值添加到builder中,支持多值参数 foreach (var value in item.Value) { queryBuilder.Add(camelizedKey, value); } } // 替换请求的QueryString为新构建的查询串 context.Request.QueryString = queryBuilder.ToQueryString(); // 继续执行后续管道 await next.Invoke(); });
关键点说明:
- 不要用
List<QueryString>,QueryString代表整个查询串,单个键值对应该用QueryBuilder来管理,它会自动处理URL编码和参数拼接,避免手动拼接的错误。 - 处理多值参数:比如如果有
key-one=val1&key-one=val2这种情况,遍历item.Value把所有值都加进去,保证参数不丢失。 - 替换
QueryString后,context.Request.Query会自动同步更新,后续的控制器、中间件拿到的就是驼峰命名的参数了。
关于驼峰转换的依赖:
你代码里用的Underscore().Camelize()是Humanizer库的方法,如果还没装这个包,需要通过NuGet安装:
Install-Package Humanizer
或者如果你不想用第三方库,也可以自己实现一个短横线转驼峰的方法,比如:
private string KebabToCamelCase(string kebabStr) { if (string.IsNullOrEmpty(kebabStr)) return kebabStr; var parts = kebabStr.Split('-'); return parts[0].ToLower() + string.Concat(parts.Skip(1).Select(p => char.ToUpper(p[0]) + p.Substring(1).ToLower())); }
这样修改后,当请求https://example.com/path?key-one=value&key-two=value2进来时,后续的代码拿到的查询参数就是keyOne=value和keyTwo=value2了,完全不需要重定向,只是在请求管道内部做了上下文修改。
内容的提问来源于stack exchange,提问作者Hasan
相关产品推荐
相关产品推荐

