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

时间:2018-08-30 23:15:50

标签: .net-core .net-core-1.1

使用此代码...

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

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

请注意,%3A尚未被编码为冒号字符,但所有其他编码后的字符仍保持编码状态。

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

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

1 个答案:

答案 0 :(得分:3)

我认为行为描述有些奇怪,所以我决定自己测试一下,实际上在.NET Framework 4.5.1和4.7.1中,%3A被解码为{{1 }}由:类提供。

.NET 4.5.1: dotnet 451 example

.NET 4.7.1: dotnet 471 example

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

.NET Core 2.1.401: dotnet core example

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

我没有时间自己做,但是我建议在.NET Framework GitHub project中引发一个错误,引用此堆栈溢出文章。

您还可以在.NET Developer Community上发布您的问题,以获取一些建议和解决方法。

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

更新1:

就在我要进行其他操作时,我意识到它的HttpRequestMessage类在执行System.Uri时实际上正在执行此错误。

以以下代码为例:

ToString()

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

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

更新2:

现在,更明显的是发生了什么,我能够挖掘这个古老的stackoverflow帖子:System.Uri and encoded colon (:)和这个social MSDN post。两者都是在很早以前创建的,并且看起来.NET团队从未决定解决。我无法从中找到Microsoft Connect bug raised的结果,但是.NET Framework GitHub项目和.NET开发人员社区页面仍然可能是从那里获得响应的最佳位置。 NET团队直接。 (社交MSDN网站主要是非微软人员,因此不会那么有用。)