Como verificar se uma string URI é válido

votos
48

Como você verificar que uma string URI é válido (que você pode alimentá-lo para o construtor Uri)?

Até agora eu só tenho o seguinte, mas por razões óbvias eu prefiro uma maneira menos bruta:

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

Tentei Uri.IsWellFormedUriString mas não parecem gostar de tudo o que você pode jogar com o construtor. Por exemplo:

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

A saída será:

Uri.IsWellFormedUriString says: False
IsValidUri says: True

Atualização / Resposta

O construtor Uri usa tipo Absolute por padrão. Este foi causando uma discrepância quando eu tentei usar Uri.TryCreate eo construtor. Você começa o resultado esperado se você combinar o UriKind tanto para o construtor e TryCreate.

Publicado 29/01/2011 em 06:04
fonte usuário
Em outras línguas...                            


4 respostas

votos
54

Um URI bem formado implica o cumprimento de certos RFC. O caminho local no seu exemplo não está em conformidade com estes. Leia mais na IsWellFormedUriStringdocumentação.

Um falso resultado desse método não implica que a Uriclasse não será capaz de analisar a entrada. Enquanto a entrada URI pode não ser RFC conformant, ele ainda pode ser um URI válido.

Atualização : E para responder a sua pergunta - como a documentação Uri mostra, há um método estático chamado TryCreateque tentará exatamente o que você quer e retornar verdadeiro ou falso (e o real Uriexemplo, se true).

Respondeu 29/01/2011 em 06:19
fonte usuário

votos
25

Desde a resposta aceita não fornece um exemplo explícito, aqui é algum código para validar URIs em 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...
}
Respondeu 03/09/2014 em 22:51
fonte usuário

votos
3

Assumindo que só querem apoiar pedidos absolutos URI e HTTP, aqui é uma função que faz o que quiser:

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;
}
Respondeu 06/11/2015 em 18:29
fonte usuário

votos
0

No seu caso, o argumento uri é um caminho absoluto que se refere a um local de arquivo, assim como pelo doc do método retorna false. Consulte este

Respondeu 29/01/2011 em 06:15
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more