Uri构造器.net框架错误
本文关键字:错误 框架 net 构造器 Uri | 更新日期: 2023-09-27 18:14:30
为什么thirdRelativeUri失败?这是。net bug吗?似乎也没有在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
文件uri方案(RFC 1738) file://[host]/path显示host是可选的。///test.html表示"由于这通常用于本地文件,因此RFC 1738中的主机通常是空的,导致开始的三元组"。(ref)"
将///test.htm更改为file:///test.htm, URI构造函数将正确解析它。AbsolutePath
将是/test.html.
我认为构造函数将"//test.htm"解释为没有方案的URI和test.htm的主机名。您可以通过检查secondRelativeUri
的值看到这一点-它是"http://test.htm/"。
您创建的第三个URI无效,因为您有太多的斜杠。
new Uri(googleU,"//test.htm")意味着Uri = http://test.html//*有效,无论如何根在某处*/
new Uri(googleU,"///test.htm")表示Uri = http:///test.html//*无效,无意义*/
新的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
即使在创建相对url时,.net也会将以两个斜杠开头的字符串视为主机名,例如"//example.org/document"。类似地,三个斜杠会造成混淆并抛出异常。如果您非常确定//test.htm和//test.htm是路径,那么您可以尝试使用UriBuilder类。