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)
其他链接
在 .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)
其他链接