Uri构造函数.NET Framework错误?

时间:2011-11-13 12:37:53

标签: c# .net uri

为什么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

,它也会失败

4 个答案:

答案 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类。