为什么Uri在不同的模式下表现不同

本文关键字:模式 Uri 为什么 | 更新日期: 2023-09-27 18:10:13

在用Uri类回答另一个问题时,我发现了一些对我来说似乎很奇怪的东西:

考虑以下两个uri:

var u1 = new Uri("http://a.b:33/abc%2fdef/c?d=f");
var u2 = new Uri("foobar://a.b:33/abc%2fdef/c?d=f");

它们只在方案上不同。所提供标识符的所有其他元素都是相同的。

那么,为什么当我转储这些Uri实例的Segments属性时,我看到u1的以下输出:

<>之前/abc/def/c之前

…但u2的输出不同?

<>之前/abc % 2 fdef/c之前

为什么不同方案的解析行为不同?

为什么Uri在不同的模式下表现不同

Uri类对不同的Uri方案使用不同的解析器。例如,对于httphttps uri,它使用HttpStyleUriParser,而对于ftp uri,它使用FtpStyleUriParser,依此类推。具有未知模式的uri由GenericUriParser解析。你可以使用UriParser注册新的模式。注册方法。

UriParser.Register(new HttpStyleParser(), "foobar", 33);