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

Why Asp.Net Core QueryHelpers don't encode @ (at) symbol?

阅读互联网上的各种资源,似乎我们必须在 URL 的查询参数中编码 @ 符号(以及 URL).

我试图在我的 ASP.NET 核心应用程序中生成一个 URL,并找到了使用 QueryHelpers.AddQueryString(...) 执行此操作的方法。但它似乎没有编码 @ 符号,即使它正在编码我测试过的所有其他符号。

问题:这种行为是否有某些特殊原因,或者只是一个错误?

我通过的测试:

var url0 = QueryHelpers.AddQueryString("base", "field", "&?=čž/");
Assert.Equal("base?field=%26%3F%3D%C4%8D%C5%BE%2F", url0);

var url = QueryHelpers.AddQueryString("base", "field", "@");
Assert.Equal("base?field=@", url);

这是因为,简单地说,@ 不需要 编码。它不是一个在 URL 上下文中有任何意义的字符,所以它没有问题。 &?= 等字符在 URL 的上下文中都有意义,因此必须进行编码。就 unicode 字符而言,我相信这些编码只是为了安全。 Unicode 在 URLs 中得到技术支持,但对它的支持相对较新,可能无法普遍实施。对它们进行编码不会伤害,这样它就可以正常工作。