为什么thirdRelativeUri会失败?这是一个.NET错误吗?似乎也没有在4.0中修复。
var googleU = new Uri("http://www.google.com");
var secondRelativeUri = new Uri(googleU,"//test.htm"); // doesn't fail
var thirdRelativeUri = new Uri(googleU,"///test.htm"); // fails - Invalid URI: The hostname could not be parsed.
更新
@dariom指出这是因为.NET中的协议相对URL处理有意义但是这对我来说仍然是错误的:
var thirdRelativeUri = new Uri("///test.htm",UriKind.Relative); // works as expected
var newUri = new Uri(googleU,thirdRelativeUri); //Fails, same error even though it's a relative URI
即使第二个Uri为Relative
答案 0 :(得分:5)
文件uri方案(RFC 1738)file:// [host] / path显示主机是可选的。 ///test.html意味着“由于这通常用于本地文件,因此RFC 1738中的主机通常为空,导致起始三元组。(ref)”
将 /// test.htm 更改为 file:///test.htm ,URI构造函数将正确解析它。它是AbsolutePath
/test.html 。
希望这有帮助。
答案 1 :(得分:2)
我认为构造函数将“// test.htm”解释为没有方案且主机名为 test.htm 的URI。您可以通过检查secondRelativeUri
的值来看到这一点 - 它是“http://test.htm/”。
您创建的第三个URI无效,因为您有太多的斜杠。
答案 2 :(得分:0)
new Uri(googleU,“// test.htm”)表示Uri = http://test.html/ / *有效,无论如何都是某个地方的根* /
new Uri(googleU,“/// test.htm”)表示Uri = http:///test.html/ / *无效,无意义* /
new Uri(“/// test.htm”,UriKind.Relative); // => Uri = ///test.htm同样的错误,而不是相对位置
var r = new Uri(“test.htm”,UriKind.Relative);
new Uri(googleU,r); // => Uri = http://www.google.com/test.htm
答案 3 :(得分:0)
即使在创建相对URL时,.net也会将以斜杠开头的字符串视为“//example.org/document”中的主机名。类似地,三个slahes造成混乱并抛出异常。如果您非常确定这些//test.htm和///test.htm是路径,那么您可以尝试使用UriBuilder类。