为什么Uri对不同的方案表现不同?

在与Uriclass级一起回答另一个问题时,我发现了一些对我来说很奇怪的东西:

考虑这两个Uris:

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

它们的区别仅在于他们的计划。 提供的标识符的所有其他元素都是相同的。

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

 / 
 ABC / 
高清/ 
 C 

…但u2输出不同?

 / 
 ABC%2fdef / 
 C 

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

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

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