Как вы проверяете, что строка uri действительна (что вы можете передать ее конструктору Uri)?
Пока у меня есть только следующее, но по очевидным причинам я бы предпочел менее грубый способ:
Boolean IsValidUri(String uri)
{
try
{
new Uri(uri);
return true;
}
catch
{
return false;
}
}
Я попробовал Uri.IsWellFformedUriString, но, похоже, ему не нравится все, что вы можете бросить в конструктор. Например:
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
Обновление / ответ
Конструктор Uri по умолчанию использует вид Absolute. Это вызывало несоответствие, когда я пытался использовать Uri.TryCreate и конструктор. Вы получите ожидаемый результат, если сопоставите UriKind как для конструктора, так и для TryCreate.
TryCreate
иUri
конструктор должны быть идентичными - попробуйте передать то же самое,UriKind
что и дляTryCreate
.Поскольку в принятом ответе нет явного примера, вот код для проверки 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... }
источник
Предполагая, что мы хотим поддерживать только абсолютные 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; }
источник
tmp
. Первый шаг в данном случае, возможно, излишен ...В моем случае я просто хотел протестировать uri, я не хочу замедлять приложение, тестирующее uri.
Boolean IsValidUri(String uri){ return Uri.IsWellFormedUriString(uri, UriKind.Absolute); }
источник
В вашем случае аргумент uri - это абсолютный путь, который относится к местоположению файла, поэтому в соответствии с документом метода он возвращает false. Обратитесь к этому
источник