为啥 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 中获取多个 IMemoryCache 实例?