System.Uri 和编码冒号 (:)

System.Uri and encoded colon (:)

在 .Net 4.5 之前,System.Uri 似乎会取消对已编码的斜杠进行编码,但这已得到修复。参考:

我遇到了与冒号相同的问题。 System.Uri 仍未编码已编码的冒号。示例:

        var uri = new Uri("http://www.example.com/?foo=http%3A%2F%2Fwww.example.com");
        var s = uri.ToString(); //http://www.example.com/?foo=http:%2F%2Fwww.example.com

注意 %3A 如何被 System.Uri 切换回 :。这是一个错误吗?最好的解决方法是什么?

使用 Uri.AbsoluteUri 怎么样?

var s = uri.AbsoluteUri; 
// http://www.example.com/?foo=http%3A%2F%2Fwww.example.com

根据消息来源,uri.ToString() 看起来它具有对某些可见部分进行转义的逻辑 here whereas .AbsoluteUri has a much simpler implementation

Uri.ToString()

根据 System.Uri.ToString() 的 MSDN 文档:

A String instance that contains the unescaped canonical representation of the Uri instance. All characters are unescaped except #, ?, and %.

然而,根据这个例子,在尝试了更多的字符串之后,看起来实际的实现有点像 'Only :, * and spaces are unescaped'

%3A (:) // gets unescaped
%20 ( ) // gets unescaped 
%2A (*) // gets unescaped

%2b, %26, %23, %24, %25 (+, &, #, $, %) // Remain as-is (escaped)

其他链接