使用此代码...
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编码期望的方法。
答案 0 :(得分:3)
我认为行为描述有些奇怪,所以我决定自己测试一下,实际上在.NET Framework 4.5.1和4.7.1中,%3A
被解码为{{1 }}由:
类提供。
但是,在.NET Core 2.1.401中,原始字符串保持不变不会发生相同的行为。
因此,这很可能是.NET Framework中HttpRequestMessage
实现的一个错误,该错误尚未复制到.NET Core(完全重写)中。
我没有时间自己做,但是我建议在.NET Framework GitHub project中引发一个错误,引用此堆栈溢出文章。
您还可以在.NET Developer Community上发布您的问题,以获取一些建议和解决方法。
除此之外,我想不出任何解决您问题的方法。
更新1:
就在我要进行其他操作时,我意识到它的HttpRequestMessage
类在执行System.Uri
时实际上正在执行此错误。
以以下代码为例:
ToString()
如您所见,原始字符串是正确的,但是ToString()的结果是错误的。
更新2:
现在,更明显的是发生了什么,我能够挖掘这个古老的stackoverflow帖子:System.Uri and encoded colon (:)和这个social MSDN post。两者都是在很早以前创建的,并且看起来.NET团队从未决定解决。我无法从中找到Microsoft Connect bug raised的结果,但是.NET Framework GitHub项目和.NET开发人员社区页面仍然可能是从那里获得响应的最佳位置。 NET团队直接。 (社交MSDN网站主要是非微软人员,因此不会那么有用。)