为什么Uri中冒号":"传递给Uri.MakeRelativeUri导致异常?

Gre*_*reg 6 c# uri

以下代码行给出了一个例外.这是框架中的错误吗?如果不是我可以采取什么方法呢?

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

Uri relativeUri = new Uri("http://test.com/asdf").MakeRelativeUri(new Uri("http://test.com/xx:yy"));
// gives => System.UriFormatException: A relative URI cannot be created because the 
// 'uriString' parameter represents an absolute URI

Uri relativeUri = new Uri("http://test.com/asdf").MakeRelativeUri(new Uri("http://test.com/xxyy"));
// this works - removed the colon between the xx and yy
Run Code Online (Sandbox Code Playgroud)

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

换句话说,我如何模仿浏览器的行为,该浏览器转换HREF和页面URI以生成用于在单击它时转到该资源的URI.

bob*_*nce 5

我认为这是一个错误.

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

Within the <path> and <searchpart> components, "/", ";", "?" are reserved.
Run Code Online (Sandbox Code Playgroud)

(不是:.)

hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
Run Code Online (Sandbox Code Playgroud)

所以,http://test.com/xx:yy是一个有效的URI.较新的RFC3968同意:

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
Run Code Online (Sandbox Code Playgroud)

当然,相对而言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 ":"
Run Code Online (Sandbox Code Playgroud)

所以MakeRelativeUri有权报告存在问题,但实际上应该通过将:在绝对URI中有效的编码自动修复%3A为在相对URI的第一段中有效的方法来自动修复它.

我通常会尝试避免MakeRelativeUri使用根相对URI,它更容易提取并且没有这个问题(/xx:yy可以).