2011-01-29 2 views
48

Come si controlla che una stringa uri sia valida (che è possibile alimentare con il costruttore Uri)?Come verificare che una stringa uri sia valida

Finora ho solo avere il seguente, ma per ovvie ragioni preferirei un modo meno bruta:

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

ho provato Uri.IsWellFormedUriString ma non sembra come tutto ciò che si può buttare a il costruttore. Per esempio:

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

L'output sarà:

Uri.IsWellFormedUriString says: False 
IsValidUri says: True 

Aggiornamento/Risposta

Il costruttore Uri utilizza tipo assoluto per impostazione predefinita. Ciò causava una discrepanza quando ho provato a utilizzare Uri.TryCreate e il costruttore. Ottenete il risultato previsto se abbinate UriKind sia al costruttore che a TryCreate.

Grazie,

+1

Buona funzione che hai fatto! +1 –

+9

Non aggiungere una risposta come modifica alla domanda. Se aggiunge qualcosa alle risposte esistenti, aggiungilo come risposta separata. Si prega di modificare la risposta fuori dalla tua domanda. –

+1

possibile duplicato di [Come verificare se una stringa è un URL HTTP valido?] (Http://stackoverflow.com/questions/7578857/how-to-check-whether-a-string-is-a-valid-http -url) – Amalea

risposta

53

Un URI ben formato implica la conformità con determinati RFC. Il percorso locale nel tuo esempio non è conforme a questi. Maggiori informazioni nella documentazione IsWellFormedUriString.

Un falso risultato di tale metodo non implica che la classe Uri non sarà in grado di analizzare l'input. Mentre l'input URI potrebbe non essere conforme a RFC, può comunque essere un URI valido.

Aggiornamento: E per rispondere alla tua domanda - come mostra la documentazione Uri, c'è un metodo statico chiamato TryCreate che tenterà esattamente quello che vuoi e restituire true o false (e l'attuale Uri esempio, se vero).

+0

La domanda è "Come si controlla che una stringa uri sia valida (che si possa alimentare al costruttore Uri)?" – Manuel

+1

TryCreate in realtà non ti dice se una stringa verrà accettata dal costruttore. Vedi Aggiornamento. – Manuel

+0

@Manuel: questo non ha alcun senso - il risultato di 'TryCreate' e il costruttore' Uri' dovrebbero essere identici - prova a passare 'UriKind' come hai fatto per 'TryCreate'. – BrokenGlass

0

Nel tuo caso l'argomento uri è un percorso assoluto che si riferisce a un percorso di file, in modo come per il doc del metodo restituisce false. Fare riferimento a this

+0

Sto usando UriKind.RelativeOrAbsolute quindi non dovrebbe avere importanza. In entrambi i casi non funziona con UriKind.Relative o UriKind.Absolute quindi non c'è fortuna lì. – Manuel

25

Dato che la risposta accettata non fornisce un esempio esplicito, ecco qualche codice per convalidare URI in 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... 
} 
+1

Non fidarti della funzione Uri.TryCreate! Ciò consentirà anche URL cattivi. Prova questo 'http: // http: // google.com/page' (rimuovi gli spazi). Questo URL supera la funzione TryCreate, ma è sbagliato. – No1Lives4Ever

+2

@ No1Lives4Ever È corretto che analizzi come valido ciò che hai menzionato, ma tecnicamente non è sbagliato. La spiegazione in inglese: utilizzando il protocollo http (** http: // **), connettersi alla voce DNS per "http" (http: // ** http **) usando una porta esplicita (ma omessa) (http : // http **: **) - quindi presumo il valore predefinito per il protocollo; hai fornito una cartella di primo livello vuota (http: // http: ** // **) ma so cosa intendevi;) seguito da un segmento di percorso "google.com" (http: // http: // ** google.com/**) e quindi la "pagina" di risorse (http: // http: //google.com/**page**) – mlhDev

3

Supponendo vogliamo solo per supportare le richieste assolute URI e HTTP, qui è una funzione che fa quello che vuoi:

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

Secondo fonti .Net [il tuo secondo controllo **! Uri.TryCreate (uri, UriKind.Absolute, out tmp) ** è ridondante perché il metodo IsWellFormedUriString contiene già la chiamata al metodo TryCreate] (http://referencesource.microsoft.com/#System/net/System/UriExt.cs,24b1613846e7f879) –

+0

è necessario un secondo controllo per rendere possibile il terzo (e ultimo) controllo. Senza di esso, non esiste il 'tmp'. Il primo passo è probabilmente ridondante in questo caso ... – Joe