C# 为什么“冒号”是:&引用;在传递给Uri.MakeRelativeUri的Uri中,是否导致异常?

C# 为什么“冒号”是:&引用;在传递给Uri.MakeRelativeUri的Uri中,是否导致异常?,c#,uri,C#,Uri,下面的代码行给出了一个异常。这是框架中的一个bug吗?如果不是,我可以采取什么方法 似乎是“:”(冒号)导致了这个问题,但是我确实看到这样的URI在生产网站上工作正常(即,在现实世界中似乎是一个有效的URI) PS.具体地说,如果是上述情况,我可以使用什么.NET类/方法(注意,我正在从web解析HTML页面)来获取(a)页面URI和(b)HTML HREF参数的相对字符串[例如,在这种情况下应该是“/xx:yy”,并返回可用于寻址该资源的有效URI 换言之,我如何模拟浏览器的行为,该浏览器翻译

下面的代码行给出了一个异常。这是框架中的一个bug吗?如果不是,我可以采取什么方法

似乎是“:”(冒号)导致了这个问题,但是我确实看到这样的URI在生产网站上工作正常(即,在现实世界中似乎是一个有效的URI)

PS.具体地说,如果是上述情况,我可以使用什么.NET类/方法(注意,我正在从web解析HTML页面)来获取(a)页面URI和(b)HTML HREF参数的相对字符串[例如,在这种情况下应该是“/xx:yy”,并返回可用于寻址该资源的有效URI


换言之,我如何模拟浏览器的行为,该浏览器翻译HREF和页面URI,以生成它在单击该资源时用于访问该资源的URI。

冒号在URL中扮演特殊角色-例如表示端口,因此是“保留的”(reserved))

URL使用一些字符来表示特殊的 用于定义其语法。什么时候 这些字符不在其应用程序中使用 URL中的特殊角色,他们需要 编码


因此,冒号应该转义。

如果找到冒号,它会尝试将冒号后面的值作为端口号进行解析,如果您不提供有效的端口号,它将失败。请参阅类似问题的一个例子。

< P>我认为这是一个错误。

RFC1738表示,
(除其他字符外)可以保留用于方案中的特殊含义。但是
http
方案不会在路径部分保留它

Within the <path> and <searchpart> components, "/", ";", "?" are reserved.
所以,
http://test.com/xx:yy
是有效的URI。较新的RFC3968同意:

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
当然,相对于
http://test.com/asdf
,生成的
xx:yy
将是绝对URI,而不是有效的相对URI:

path-noscheme = segment-nz-nc *( "/" segment )
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
                ; non-zero-length segment without any colon ":"
因此,
MakeRelativeUri
报告存在问题是一种权利,但实际上它应该通过将绝对URI中有效的
编码为相对URI的第一段中有效的
%3A
来自动修复它


我通常会尽量避免使用根相对URI(
MakeRelativeUri
),因为根相对URI更容易提取并且没有这个问题(
/xx:yy
可以)。

Jon Postel:“接受的内容要自由,发送的内容要保守”。请引用RFC和它的段落号来证明这是一个有效的URI。谢谢Shane-我已经把这个问题做得更具体了re什么可以帮助我感谢Tanner-我已经把这个问题做得更具体了re什么可以帮助我了Thank bobince太好了-你知道一个直接的.net方法从一个页面URI中给出根相对URI吗+HRefString?现在只是在找一个…或者你必须“自己做”?实际上我应该开始一个新的问题,并将这个问题标记为完成…我会这样做创建这个特定的问题在真正伟大的答案-特别是坚实的参考。
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
path-noscheme = segment-nz-nc *( "/" segment )
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
                ; non-zero-length segment without any colon ":"