Webclient 不喜欢 UrlEncoded 斜杠。如何让它发挥作用?

Webclient doesnt like UrlEncoded slash. How to make it work?

我正在尝试使用 .net 2.0 网络客户端(无法升级)将 URL 传递给 API。 webclient 调用仅在编码值中没有斜杠时才有效。知道它失败的原因以及如何让它发挥作用吗?

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/" + requestUrl);
            }
        }
    }
}

上面的不行,下面的就可以了

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Xml.Serialization;
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/" + requestUrl);
            }
        }
    }
}

看起来 requestUrl 是一个查询参数,但您将其添加到 URL 的路径中。

结果是

https://localhost:12345/api/getstuff/https%3A%2F%2Fwww.somewebsite.com

“%”是一个不安全的字符,会导致不可预知的结果。

相反,尝试将其设为查询字符串参数:

var requestUrl = HttpUtility.UrlEncode("https:www.somewebsite.com");
var stringResult = client.DownloadString(
    "https://localhost:12345/api/getstuff/?requestUrl=" + requestUrl);

既然 URL 编码的参数在查询字符串中而不是在路径中,它应该没问题。