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 и не содержит "://"

Другие вопросы по тегам