Uri Конструктор .NET Framework Ошибка? - PullRequest
3 голосов
/ 13 ноября 2011

Почему третийRelativeUri дает сбой? Это ошибка .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.

UPDATE:

@ dariom указал, что это связано с тем, что протокол относительной обработки URL в .NET имеет смысл, однако мне все еще это кажется ошибочным:

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 ]

5 голосов
/ 13 ноября 2011

Файл схемы uri (RFC 1738) file: // [host] / path показывает, что host является необязательным.///test.html будет означать «Так как это обычно используется для локальных файлов, хост из RFC 1738 часто пуст, что приводит к начальной тройке /. (ref) »

Изменение /// test.htm до file: ///test.htm и конструктор URI проанализирует его правильно.Это AbsolutePath будет / test.html .

Надеюсь, это поможет.

2 голосов
/ 13 ноября 2011

Я думаю, что конструктор интерпретирует "// test.htm" как URI без схемы и имени хоста test.htm .Вы можете убедиться в этом, изучив значение secondRelativeUri - это "http://test.htm/".

Третий создаваемый вами URI недействителен, поскольку у вас слишком много слешей.

0 голосов
/ 20 ноября 2011

Даже при создании относительных URL .net обрабатывает строку, начинающуюся с косой черты, как имя хоста, как в "//example.org/document".Точно так же три рабства создают путаницу, и возникает исключение.Если вы уверены, что эти //test.htm и ///test.htm являются путями, то вы можете попробовать использовать класс UriBuilder.

0 голосов
/ 13 ноября 2011

новый Uri (googleU, "// test.htm") означает Uri = http://test.html/ / * действительный, в любом случае рут где-то * /

новый Uri (googleU, "///test.htm ") означает Uri = http: ///test.html/ / * недействительно, бессмысленно * /

new Uri (" /// test.htm ", UriKind.Родственник);// => Uri = ///test.htm та же ошибка, не относительное местоположение

var r = new Uri ("test.htm", UriKind.Relative);

new Uri (googleU, r);// => Uri = http://www.google.com/test.htm

...