System.Web.HttpUtility.ParseQueryString的不区分大小写替代方案
不区分大小写的查询字符串解析实现方案
存在可用的替代实现,你可以通过以下两种常用方式满足需求:
方案1:自定义解析逻辑,直接生成不区分大小写的NameValueCollection
NameValueCollection本身支持在构造时传入比较器,你可以自己实现解析逻辑,生成不区分大小写的参数集合:
using System.Collections.Specialized; public static NameValueCollection ParseQueryStringCaseInsensitive(string queryString) { // 构造时指定不区分大小写的比较器 var resultColl = new NameValueCollection(StringComparer.OrdinalIgnoreCase); // 移除查询字符串开头的?标记 if (queryString.StartsWith("?")) { queryString = queryString.TrimStart('?'); } // 拆分所有参数键值对 var paramPairs = queryString.Split('&', StringSplitOptions.RemoveEmptyEntries); foreach (var pair in paramPairs) { // 仅拆分第一个=,避免参数值中包含=时解析错误 var keyValue = pair.Split('=', 2); string key = Uri.UnescapeDataString(keyValue[0].Trim()); string value = keyValue.Length > 1 ? Uri.UnescapeDataString(keyValue[1].Trim()) : string.Empty; resultColl.Add(key, value); } return resultColl; }
调用方式如下,替换原来的HttpUtility.ParseQueryString调用即可:
if (ApplicationDeployment.IsNetworkDeployed) { string queryString = ApplicationDeployment.CurrentDeployment.ActivationUri.Query; var nameValueColl = ParseQueryStringCaseInsensitive(queryString); // 此时不同大小写的参数名都可以正常匹配 if (nameValueColl.AllKeys.Contains("arg1")) { // 业务代码可以正常执行 } }
方案2:保留原生解析逻辑,查询时指定不区分大小写的比较规则
如果你不想自己实现解析逻辑,也可以在查询参数时额外指定比较器,无需修改原有解析代码:
if (ApplicationDeployment.IsNetworkDeployed) { string queryString = ApplicationDeployment.CurrentDeployment.ActivationUri.Query; var nameValueColl = System.Web.HttpUtility.ParseQueryString(queryString); // 查询时传入不区分大小写的比较器 if (nameValueColl.AllKeys.Contains("arg1", StringComparer.OrdinalIgnoreCase)) { // 业务代码可以正常执行 // 取值时也可以先匹配大小写再兜底,或者封装成扩展方法简化调用 string arg1Value = nameValueColl["ARG1"] ?? nameValueColl["arg1"]; } }
如果需要频繁读取参数,也可以把原生解析结果转成不区分大小写的字典,使用更便捷:
var paramDict = nameValueColl.AllKeys .ToDictionary(k => k, k => nameValueColl[k], StringComparer.OrdinalIgnoreCase); // 字典自动支持不区分大小写查询 if (paramDict.TryGetValue("arg1", out string arg1Value)) { // 业务逻辑 }
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

