提问人:Display name 提问时间:11/30/2021 更新时间:11/30/2021 访问量:300
Webclient 不喜欢 UrlEncoded 斜杠。如何让它发挥作用?
Webclient doesnt like UrlEncoded slash. How to make it work?
问:
我正在尝试使用 .net 2.0 webclient 将 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);
}
}
}
}
答:
0赞
Scott Hannen
11/30/2021
#1
它看起来像是一个查询参数,但你正在将其添加到 URL 的路径中。requestUrl
结果是
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 编码的参数位于查询字符串中而不是路径中,它应该没问题。
评论
0赞
Bernd Wechner
1/23/2023
我完全有他的问题,但是唉,您的建议对我没有帮助,因为相关 API 不支持在上面的示例中将 requestUrl 作为查询字符串参数提供,而仅作为请求路径本身的一部分。这是 GitLab API:docs.gitlab.com/ee/api/......
0赞
Scott Hannen
1/23/2023
看起来 API 在路径中需要这样做,但显然它处理了 % 字符。它显示了一个示例 URL:。显然,如果您对file_path部分进行 URL 编码,它应该会处理它。https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb?ref=master
0赞
Scott Hannen
1/23/2023
这让我想知道我最初的答案。通过将参数移动到查询字符串来解决问题似乎更容易,因为这是 OP 正在编写的 API,因此他们可以控制它。虽然有记录表明 % 是一个不安全的字符,但显然 GitLab API 允许它。
1赞
Bernd Wechner
1/24/2023
我做 URL 对文件路径进行编码,并且 URL 使用 curl 工作正常,奇怪的是,这是暮光之城材料,如果我在加载到 .exe 中的 C# DLL 中使用它,它可以工作,但是如果我使用相同的 DLL 作为 IIS 或 IIS Express 下的 ASP 网站的一部分, 然后服务器收到解码后的 URL,它不再看到它看到的 %2F,并且 GitLab API 返回 404。令人困惑的 .NET 行为似乎与上下文相关(相同的代码、相同的 DLL、在 .exe 中链接不会在传输之前解码 URL,由 IIS 加载在传输之前对 URL 进行解码。
0赞
Bernd Wechner
2/15/2023
顺便说一句,我为此找到的唯一解决方案是使用 GitLab 提供的 GraphQL API。
评论