Как проверить правильность строки URI - PullRequest
58 голосов
/ 29 января 2011

Как проверить, что строка 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 по умолчанию использует вид Absolute. Это вызывало расхождение, когда я пытался использовать Uri.TryCreate и конструктор. Вы получите ожидаемый результат, если сопоставите UriKind как для конструктора, так и для TryCreate.

Ответы [ 4 ]

69 голосов
/ 29 января 2011

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

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

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

28 голосов
/ 04 сентября 2014

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

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...
}
6 голосов
/ 06 ноября 2015

Предполагая, что мы хотим поддерживать только абсолютные запросы 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;
}
0 голосов
/ 29 января 2011

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

...