如何使用HttpUtility获取URL中含&的完整查询字符串?
问题分析与解决方案
你的问题核心在于URL规范中&是参数分隔符,如果参数值本身包含&但未编码,HttpUtility.ParseQueryString会将&后的内容识别为新参数,而非当前参数值的一部分。另外你的代码里有个小错误:new Uri(url.Query)是错误用法,应该通过new Uri(url).Query获取正确的查询字符串部分。
正确处理方式
1. 构造URL时提前编码参数值
如果是你自己构造URL,在将包含&的参数值拼入URL前,必须用HttpUtility.UrlEncode对参数值进行编码,把&转为%26:
// 待编码的参数值(包含&) string nameValue = "mac&chess"; // 编码参数值 string encodedName = HttpUtility.UrlEncode(nameValue); // 构造符合规范的URL string url = $"https://somewhere.go/hello?name={encodedName}&taste=salty"; // 解析查询字符串 var queryParams = HttpUtility.ParseQueryString(new Uri(url).Query); string getName = queryParams.Get("name"); Console.WriteLine(getName); // 输出: mac&chess
2. 处理已存在的未编码URL(不推荐)
如果是接收外部传入的不符合规范的URL(对方未对参数值里的&编码),只能手动做兼容处理(这种情况不符合URL标准,尽量避免):
string url = "https://somewhere.go/hello?name=mac&chess&taste=salty"; // 手动替换目标参数里的&为编码后的%26 string modifiedUrl = url.Replace("name=mac&chess", "name=mac%26chess"); var queryParams = HttpUtility.ParseQueryString(new Uri(modifiedUrl).Query); string getName = queryParams.Get("name"); Console.WriteLine(getName); // 输出: mac&chess
为什么UrlPathEncode没用?
UrlPathEncode是针对URL路径部分的编码逻辑,不会处理查询字符串中的参数分隔符&,所以无法解决你的问题,必须使用针对查询参数值的UrlEncode方法。
内容的提问来源于stack exchange,提问作者Vorasoda
相关产品推荐
相关产品推荐

