【问题标题】:How to stop HttpRequestMessage from unencoding %3A to a colon in the request URI (asp.net core)如何阻止 HttpRequestMessage 将 %3A 取消编码为请求 URI 中的冒号(asp.net 核心)
【发布时间】:2018-08-30 23:15:50
【问题描述】:

使用此代码...

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 编码预期的方法。

【问题讨论】:

  • 字符串“example.com/?var=a%3Ab%3Dc%26d%3Fe”从何而来?
  • 根据我的回答,我认为这不是 ASP.NET Core 中的问题,而只是 .NET Frameworks 中的问题。您能否确认您是否真的在使用 ASP.NET Core?如果没有,您应该将其从标题和标签中删除。
  • 阿德里安,谢谢。我可以确认目标框架是 .NET Core 1.1。我升级到 .NET Core 2.0 看看是否可以解决问题。没有运气。我将考虑升级到 .NET Core 2.1.401,因为您似乎已经在该版本中找到了修复。将发布结果。
  • @Chas,没问题。您可能还想修复问题的标记,然后将其标记为 .net-core 或 .net-core-1.1 而不是 asp.net、.net、asp.net-core-mvc,以便明确这是您的问题的平台涉及到。

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


【解决方案1】:

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

.NET 4.5.1:

.NET 4.7.1:

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

.NET Core 2.1.401:

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

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

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

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

更新 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();

在 .NET Framework 中执行时:

可以看到,原来的字符串是正确的,但是ToString()的结果是错误的。

更新 2:

现在发生的事情已经很明显了,我能够挖掘出这个旧的 stackoverflow 帖子:System.Uri and encoded colon (:) 和这个social MSDN post。两者都是很久以前创建的,看起来 .NET 团队从未决定解决这个问题。我无法从我所在的位置访问Microsoft Connect bug raised 以了解它的结果,但 .NET Framework GitHub 项目和 .NET 开发人员社区页面仍然可能是获得 .NET 团队响应的最佳位置直接地。 (社交 MSDN 网站大多是非 Microsoft 人员,因此不会有帮助)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多