【发布时间】:2020-01-21 17:29:55
【问题描述】:
如果我在 .Net Core 3.1 中这样做:
await new HttpClient().GetAsync("http://test.com/page?parameter=%2D%2E%5F%2E%2D");
然后会发生这种情况:
GET http://test.com/page?parameter=-._.- HTTP/1.1
但这就是我想要的:
GET http://test.com/page?parameter=%2D%2E%5F%2E%2D HTTP/1.1
背景是我从第三方获得了一个签名的 URL,我需要按原样使用该 url,非未转义。我设法找到带有未转义 url 的资源,但签名检查在另一端失败,因为他们在请求中看到的 url 不是已签名的 url。
我可以将 url 粘贴到任何浏览器并获取资源,但是当我在 .Net Core 3.1 中以编程方式执行此操作时签名检查失败。
应该根据documentation on the Uri Class 进行转义:
转义字符(也称为百分比编码八位字节) 具有保留用途的被解码(也称为未转义)。 这些未保留的字符包括大写和小写字母 (%41-%5A 和 %61-%7A)、十进制数字 (%30-%39)、连字符 (%2D)、句点 (%2E)、下划线 (%5F) 和波浪号 (%7E)。
我已经尝试过这些问题中列出的解决方案:
GETting a URL with an url-encoded slash。但是
schemeSetting似乎不适用于.Net Core 3.1,解决方法ForceCanonicalPathAndQuery也不起作用。How to make System.Uri not to unescape %2f (slash) in path?。同样
schemeSetting似乎不适用于.Net Core 3.1,解决方法LeaveDotsAndSlashesEscaped也不起作用。
那么,有谁知道我如何在 .Net Core 3.1 上按原样使用已签名的 url,而不是未转义的?
【问题讨论】:
-
http://test.com/page?parameter=-._.-是合法的url,不需要编码 -
是的,但我的网址是
http://test.com/page?parameter=%2D%2E%5F%2E%2D,问题是它正在被解码。我想使用它未解码、未转义、原始和原样