为什么 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 中得到技术支持,但对它的支持相对较新,可能无法普遍实施。对它们进行编码不会伤害,这样它就可以正常工作。
阅读互联网上的各种资源,似乎我们必须在 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 中得到技术支持,但对它的支持相对较新,可能无法普遍实施。对它们进行编码不会伤害,这样它就可以正常工作。