ASP.NET MVC 5.2.7如何获取查询字符串参数的原始值?
获取ASP.NET MVC 5.2.7中查询字符串参数的原始编码值
我之前也碰到过这个需求——默认的Request.QueryString确实会自动帮你解码参数值,把%20和+都转换成空格,没法区分原始的编码形式。不过不用自己从头实现解析逻辑,用.NET Framework内置的服务器变量或者Uri属性就能搞定:
方法1:利用Request.ServerVariables获取原始查询串
服务器变量QUERY_STRING会直接返回未经任何解码的原始查询字符串内容(不包含开头的?),你可以基于它拆分出每个参数的原始键值对:
// 获取原始查询字符串 string rawQuery = Request.ServerVariables["QUERY_STRING"]; if (!string.IsNullOrEmpty(rawQuery)) { // 拆分每个键值对 var rawParams = rawQuery.Split('&') .Where(param => !string.IsNullOrWhiteSpace(param)) .Select(param => { // 按第一个=拆分,避免参数值里包含=的情况 var keyValueParts = param.Split(new[] { '=' }, 2); return new { Key = keyValueParts[0], RawEncodedValue = keyValueParts.Length > 1 ? keyValueParts[1] : string.Empty }; }); // 提取目标参数p的原始值 string pRawValue = rawParams.FirstOrDefault(p => p.Key == "p")?.RawEncodedValue; // 此时pRawValue会是"lol%20cat"或"lol+cat",完全保留原始编码 }
方法2:通过Request.Url.Query获取原始查询串
如果更习惯用Uri相关的属性,也可以用Request.Url.Query,它返回的是包含开头?的原始查询串,只需要先去掉开头的?再拆分即可:
string rawQueryWithPrefix = Request.Url.Query; if (!string.IsNullOrEmpty(rawQueryWithPrefix) && rawQueryWithPrefix.StartsWith("?")) { string rawQuery = rawQueryWithPrefix.Substring(1); // 后续拆分逻辑和方法1完全一致 var rawParams = rawQuery.Split('&') .Where(param => !string.IsNullOrWhiteSpace(param)) .Select(param => { var keyValueParts = param.Split(new[] { '=' }, 2); return new { Key = keyValueParts[0], RawEncodedValue = keyValueParts.Length > 1 ? keyValueParts[1] : string.Empty }; }); string pRawValue = rawParams.FirstOrDefault(p => p.Key == "p")?.RawEncodedValue; }
为什么不用Request.QueryString?
Request.QueryString内部会自动执行URL解码,它会把%20(URL编码的空格)和+(表单编码的空格)统一转换成空格字符,所以没法区分原始的编码形式,这也是你只能拿到解码后值的原因。
上面两种方法都是基于.NET内置的原始请求数据,完全可靠,不需要自己实现复杂的URL解析逻辑。
内容的提问来源于stack exchange,提问作者Gérard Lambert
相关产品推荐
相关产品推荐

