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

spe*_*der 4 c# uri url-encoding percent-encoding

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

考虑这两个Uris:

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");
Run Code Online (Sandbox Code Playgroud)

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

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

/ 
abc/ 
def/ 
c 

......但不同的输出u2

/ 
abc%2fdef/ 
c 

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

dtb*_*dtb 5

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

UriParser.Register(new HttpStyleParser(), "foobar", 33);
Run Code Online (Sandbox Code Playgroud)