Подтвердить что ты не робот

Как проверить правильность строки uri

Как вы проверяете правильность строки uri (которую вы можете передать ее конструктору Uri)?

До сих пор у меня было только следующее, но по очевидным причинам я предпочел бы менее грубый способ:

    Boolean IsValidUri(String uri)
    {
        try
        {
            new Uri(uri);
            return true;
        }
        catch
        {
            return false;
        }
    }

Я попробовал Uri.IsWellFormedUriString, но мне не кажется, что все, что вы можете бросить в конструкторе. Например:

String test = @"C:\File.txt";
Console.WriteLine("Uri.IsWellFormedUriString says: {0}", Uri.IsWellFormedUriString(test, UriKind.RelativeOrAbsolute));
Console.WriteLine("IsValidUri says: {0}", IsValidUri(test));

Выход будет:

Uri.IsWellFormedUriString says: False
IsValidUri says: True

Update/Ответ

Конструктор Uri по умолчанию использует добрый Абсолют. Это вызвало несоответствие, когда я попытался использовать Uri.TryCreate и конструктор. Вы получите ожидаемый результат, если вы согласитесь с UriKind как для конструктора, так и для TryCreate.

Спасибо,

4b9b3361

Ответ 1

Хорошо сформированный URI подразумевает соответствие определенным RFC. Локальный путь в вашем примере не соответствует этим. Подробнее читайте в документации IsWellFormedUriString.

Ложный результат этого метода не означает, что класс Uri не сможет проанализировать ввод. Хотя вход URI может не соответствовать RFC, он все равно может быть допустимым URI.

Обновить. И чтобы ответить на ваш вопрос - как показывает документация Uri, существует статический метод TryCreate, который попытается выполнить именно то, что вы хотите, и вернете true или false (и фактический экземпляр Uri, если true).

Ответ 2

Поскольку принятый ответ не содержит явного примера, вот какой-то код для проверки URI в С#:

Uri outUri;

if (Uri.TryCreate("ThisIsAnInvalidAbsoluteURI", UriKind.Absolute, out outUri)
   && (outUri.Scheme == Uri.UriSchemeHttp || outUri.Scheme == Uri.UriSchemeHttps))
{
    //Do something with your validated Absolute URI...
}

Ответ 3

Предполагая, что мы хотим поддерживать только абсолютные запросы URI и HTTP, вот функция, которая делает то, что вы хотите:

public static bool IsValidURI(string uri)
{
    if (!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
        return false;
    Uri tmp;
    if (!Uri.TryCreate(uri, UriKind.Absolute, out tmp))
        return false;
    return tmp.Scheme == Uri.UriSchemeHttp || tmp.Scheme == Uri.UriSchemeHttps;
}

Ответ 4

В вашем случае аргумент uri является абсолютным путем, который ссылается на расположение файла, так как в doc метода он возвращает false. См. this