Uri.IsWellFormedUriString для совместимости относительных URL-адресов Hashbang
В следующих тестах почему (только) последний проваливается?
[Fact]
public void IsWellFormedUriString_AbsolutNonHashTagUri_ReturnsTrue()
{
Assert.True(Uri.IsWellFormedUriString("http://www.RegularSite.org/Home", UriKind.Absolute));
}
[Fact]
public void IsWellFormedUriString_RelativeNonHashTagUri_ReturnsTrue()
{
Assert.True(Uri.IsWellFormedUriString("Home", UriKind.Relative));
}
[Fact]
public void IsWellFormedUriString_AbsolutHashTagUri_ReturnsTrue()
{
Assert.True(Uri.IsWellFormedUriString("http://www.w3.org/#!Home", UriKind.Absolute));
}
[Fact]
public void IsWellFormedUriString_RelativeHashTagUri_ReturnsTrue()
{
// Fails!
Assert.True(Uri.IsWellFormedUriString("#!Home", UriKind.Relative));
}
Если Uri
признает Hashbangs в Абсолютной версии IsWellFormedUriString
почему не в относительной версии? Что мне не хватает?
Примечание: это не помогает
1 ответ
Причина, по которой это не работает, как и следовало ожидать, заключается в том, что hashbang не является частью схемы URI. В этом методе предполагается, что иерархическая часть формата URI и хеш-метка (и впоследствии хэш-банг) не являются членами иерархической части, из которой определяется относительный и абсолютный путь.
<> является обязательной частью
[ ] является необязательной частью
<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]
в качестве примера абсолютного URI; запрос, если я не ошибаюсь, игнорируется, который включает фрагмент и метку хеша
http://domain.com/path/to/something/?query=1#fragment
Вот еще немного информации для вас. Это все из MSDN, описывающего Uri.IsWellFormedUriString()
метод
Указывает, является ли строка правильно сформированной, пытаясь создать URI со строкой, и гарантирует, что строка не требует дальнейшего экранирования.
Примечания:
По умолчанию строка считается правильно сформированной в соответствии с RFC 2396 и RFC 2732. Если разрешен синтаксический анализ международных идентификаторов ресурсов (IRI) или интернационализированных доменных имен (IDN), строка считается правильно сформированной в соответствии с RFC 3986 и RFC 3987.
Строка считается плохо сформированной, в результате чего метод возвращает значение false, если возникает любое из следующих условий
Ниже приведены некоторые примеры сбоев:
http://www.contoso.com/path???/file name
Строка не правильно экранирована.C:\ каталог \ имя
Строка является абсолютным Uri, который представляет неявный файл Uri.Файл: // C: / каталог / имя_файла
Строка представляет собой абсолютный URI, в котором отсутствует косая черта перед путем.HTTP:\ хост / путь / файл
Строка содержит неэкранированные обратные косые черты, даже если они будут рассматриваться как прямые косые чертыwww.contoso.com/path/file
Строка представляет иерархический абсолютный Uri и не содержит "://"