为啥 Asp.Net Core QueryHelpers 不编码逗号 (,) 符号?

Posted

技术标签:

【中文标题】为啥 Asp.Net Core QueryHelpers 不编码逗号 (,) 符号?【英文标题】:Why Asp.Net Core QueryHelpers don't encode comma (,) symbol?为什么 Asp.Net Core QueryHelpers 不编码逗号 (,) 符号? 【发布时间】:2022-01-14 11:38:45 【问题描述】:

为什么 Asp.Net Core QueryHelpers 不编码逗号 (,) 符号?

link1link2 表示应该对逗号(,) 符号进行编码

QueryHelpers.AddQueryString(url, queryString);

上面的行返回下面的输出,状态参数中没有编码逗号(,)。

“https://bank.com?client_id=App1&redirect_uri=http%3A%2F%2Fgoogle.com&state=Alice,Bob,Cherry”

【问题讨论】:

链接页面错误。逗号完全有效且安全,无需编码。它在 URL 查询字符串中没有特殊用途。 @madreflection,link2 提一下怎么样? 他们这样做很好,这样做并没有错,但不为逗号做这件事也没有错,所以对它进行编码的期望是不正确的。 现在让我们解决一下业务需求 包含技术规范的愚蠢问题。 是错的。各种错误。 您可以在此处反击并说“此业务需求超出其权限范围,需要删除。” 【参考方案1】:

答案:

正如@madreflection 所说,引用的文档是错误的。 C# 功能正常。

回到基础:

网络模式中指定规则的所有内容均由其各自的 RFC 制定

在这种情况下,我们必须查看:RFC 3986 about URI Generic Syntax

生成 URI 的应用程序经常使用保留字符 允许在段中分隔特定于方案的或 取消引用处理程序特定的子组件。例如, 分号 (";") 和等号 ("=") 保留字符经常被使用 分隔适用于该参数的参数和参数值 部分。逗号 (",") 保留字符通常用于 类似的目的。例如,一个 URI 生产者可能会使用一个段 例如 "name;v=1.1" 表示对 的 1.1 版的引用 “name”,而另一个可能使用诸如“name,1.1”之类的段来 表示相同。参数类型可以由特定于方案的定义 语义,但在大多数情况下,参数的语法特定于 URI 解引用算法的实现。

这里有两点很清楚:

不需要编码。 建议由 arch 保留用于语法问题,而不是字符串拆分分隔符。

你可以使用这个工具:https://0mg.github.io/tools/uri/ 确保您的链接在该 RFC 中有效

【讨论】:

为了澄清这个答案,当我说链接页面错误时,我指的是第一个链接,这是当时提供的唯一链接。第二个链接。作为响应添加,包含准确的信息,但 OP 没有正确解释信息,这似乎也是第一个链接信息不正确的基础。 @madreflection 是的,对不起我的“缩写”,感谢澄清我的回答

以上是关于为啥 Asp.Net Core QueryHelpers 不编码逗号 (,) 符号?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Asp.net Core 无法读取 Ajax 参数?

为啥 ASP.NET Core 密码验证规则不起作用?

为啥要在 ASP.Net Core 中获取多个 IMemoryCache 实例?

asp.net core 上传文件服务器拒绝是为啥?

为啥从 ASP.NET Core Web API 的 ControllerBase 与 Controller 派生?

为啥我的 Asp.Net Core 日志中出现“不支持 POST 请求”?