.NET 2.0 WebClient无法处理UrlEncode编码斜杠问题如何解决
问题原因
- .NET Framework 2.0 底层的URI解析器存在默认行为:会自动将URL路径中已编码的斜杠
%2F解码为原始的/字符。 - 第一段代码中,参数
https://www.somewebsite.com经过UrlEncode后会产生%2F,拼接成请求路径后,.NET底层自动把%2F解码回/,导致实际请求的路由被拆分,原本的路径结构/api/getstuff/[参数]变成了/api/getstuff/https:/www.somewebsite.com,服务端无法匹配到对应接口,因此请求失败。 - 第二段代码的参数本身不含斜杠,编码后不会生成
%2F,不会触发自动解码逻辑,因此可以正常请求。
解决方案
方案1:改路径参数为查询字符串参数(优先推荐)
将URL参数从路径后拼接改为查询字符串传递,.NET不会自动解码查询字符串中的%2F,无需修改其他配置:
using System.Net; using System.Text; using System.Web; namespace ConsoleAppWebClient { class Program { static void Main(string[] args) { using (var client = new WebClient()) { client.Encoding = Encoding.UTF8; client.Headers[HttpRequestHeader.Accept] = "application/xml"; var requestUrl = HttpUtility.UrlEncode("https://www.somewebsite.com"); // 改为查询字符串传递参数 var stringResult = client.DownloadString("https://localhost:12345/api/getstuff?url=" + requestUrl); } } } }
对应调整服务端接口,从查询字符串中获取url参数即可。
方案2:修改应用配置关闭路径自动解码
如果必须使用路径参数,可在项目的app.config配置文件中添加如下配置,关闭URI解析器自动解码路径斜杠的行为:
<configuration> <uri> <schemeSettings> <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> <add name="https" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> </schemeSettings> </uri> <!-- 其他原有配置 --> </configuration>
该配置仅对当前应用生效,无需修改业务代码,适配.NET Framework 2.0 SP1及以上版本。
方案3:参数双层编码
如果既不能改服务端接口也不能改配置,可以对参数做两次UrlEncode,让.NET底层解码一次后仍保留编码后的斜杠:
// 两次编码 var requestUrl = HttpUtility.UrlEncode(HttpUtility.UrlEncode("https://www.somewebsite.com")); var stringResult = client.DownloadString("https://localhost:12345/api/getstuff/" + requestUrl);
服务端拿到参数后做一次UrlDecode即可得到原始参数值。
内容的提问来源于stack exchange,提问作者Display name
相关产品推荐
相关产品推荐

