You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:45:08