如何阻止 HttpRequestMessage 将 %3A 取消编码为请求 URI 中的冒号(asp.net 核心)

Cha*_*has 2 .net-core .net-core-1.1

使用此代码...

using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, 
"https://example.com/?var=a%3Ab%3Dc%26d%3Fe")
{
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

...request.RequestUri现在具有值“ https://example.com/?var=a:b%3Dc%26d%3Fe

请注意 %3A 已取消编码为冒号字符,但所有其他编码字符仍保持编码状态。

如何防止 %3A 像所有其他编码字符一样被取消编码?

对于上下文,我正在调用外部 API。冒号抛出错误。我无法控制外部 API,因此需要找到一种符合 API 编码期望的方法。

Adr*_*ian 5

我认为行为描述得有点离奇,所以我决定测试此我自己,而其实在.NET框架4.5.1和4.7.1,将%3A被解码成:HttpRequestMessage类。

.NET 4.5.1: dotnet 451 示例

.NET 4.7.1: dotnet 471 示例

但是,在 .NET Core 2.1.401 中,如果原始字符串保持不变,则不会发生相同的行为。

.NET 核心 2.1.401: dotnet 核心示例

因此,这很可能是HttpRequestMessage.NET Framework 中实现的错误,该错误未复制到 .NET Core(完全重写)。

我没有时间自己做,但我建议在.NET Framework GitHub 项目中提出一个错误,参考这个堆栈溢出帖子。

您还可以在.NET 开发人员社区上发布您的问题,以获得一些建议和解决方法。

除此之外,我想不出任何解决您问题的方法。

更新1:

就在我要开始做其他事情时,我意识到它System.Uri是在执行ToString().

以下面的代码为例:

Uri uri = new Uri("https://example.com/?var=a%3Ab%3Dc%26d%3Fe");
var original = uri.OriginalString;
var toString = uri.ToString();
Run Code Online (Sandbox Code Playgroud)

在 .NET Framework 中执行时: uri.ToString()

如您所见,原始字符串是正确的,但 ToString() 的结果是错误的。

更新 2:

现在发生的事情更明显了,我能够挖掘出这个旧的 stackoverflow 帖子:System.Uri 和编码的冒号 (:)以及这个社交 MSDN 帖子。两者都是很久以前创建的,看起来 .NET 团队从未决定解决这个问题。我无法访问从我所在的位置引发Microsoft Connect 错误以了解其结果,但 .NET Framework GitHub 项目和 .NET 开发人员社区页面仍然可能是从 .NET 获得响应的最佳位置直接组队。(社交 MSDN 站点主要是非 Microsoft 人员,因此不会有太大帮助)。