ASP.Net WebForms格式错误查询字符串求助:参数前误用?替代&
处理ASP.NET WebForms中格式错误的查询字符串(参数用?分隔而非&)
在ASP.NET WebForms里,默认的Request.QueryString只会识别第一个?后的&作为参数分隔符,碰到像www.somesite.com?param1=a?param2=b这种错误格式的查询字符串时,第二个参数param2根本取不到。而且你提到参数值可能包含特殊字符(包括?),所以我们得做更严谨的处理,不能粗暴替换所有?。
解决方案步骤:
获取原始查询字符串
先拿到URL中完整的查询部分(包含开头的?):string rawQuery = Request.Url.Query;替换非法的参数分隔符
?为&
我们需要用正则表达式来区分「作为参数分隔符的?」和「参数值里的?」。只替换那些后面紧跟着合法参数名(字母、数字、下划线)的?:using System.Text.RegularExpressions; // 去掉开头的?,处理内部的非法分隔符 string queryContent = rawQuery.TrimStart('?'); // 正则匹配:前面是非?字符,后面是参数名开头的?,替换为& string correctedQuery = Regex.Replace(queryContent, @"(?<=[^?])\?(?=[a-zA-Z0-9_])", "&");解析修正后的查询字符串
用HttpUtility.ParseQueryString来解析修正后的内容,这样就能正常获取所有参数了:using System.Web; NameValueCollection correctedQueryParams = HttpUtility.ParseQueryString(correctedQuery); // 现在可以正常获取参数 string param1 = correctedQueryParams["param1"]; string param2 = correctedQueryParams["param2"];
为什么这个正则有效?
(?<=[^?]):正向后顾断言,确保要替换的?前面不是另一个?(避免替换参数值里连续的?)\?:匹配要替换的分隔符?(?=[a-zA-Z0-9_]):正向前瞻断言,确保?后面是合法的参数名开头(参数名只能以字母、数字或下划线开头)
这样既处理了错误的分隔符,又不会破坏参数值里的?。
极端情况测试
如果遇到参数值本身包含?的错误格式,比如?param1=a?test?param2=b,修正后会变成param1=a?test¶m2=b,解析后param1的值是a?test,param2是b,完全符合预期。
内容的提问来源于stack exchange,提问作者Kershaw
相关产品推荐
相关产品推荐

