2011-01-29 17 views
48

¿Cómo verifica que una cadena uri es válida (que puede alimentarla al constructor Uri)?Cómo comprobar que una cadena uri es válida

Hasta ahora sólo tienen la siguiente, pero por razones obvias preferiría una manera menos bruta:

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

Probé Uri.IsWellFormedUriString pero no parece que les gusta todo lo que usted puede lanzar en el constructor Por ejemplo:

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

La salida será:

Uri.IsWellFormedUriString says: False 
IsValidUri says: True 

actualización/respuesta

El constructor utiliza Uri tipo absoluto por defecto. Esto estaba causando una discrepancia cuando intenté usar Uri.TryCreate y el constructor. Obtendrá el resultado esperado si coincide con UriKind para el constructor y TryCreate.

Gracias,

+1

¡Buena función que ha realizado! +1 –

+9

No agregue una respuesta como edición a la pregunta. Si agrega algo a las respuestas existentes, agréguelo como una respuesta separada. Por favor edite la respuesta de su pregunta. –

+1

posible duplicado de [¿Cómo comprobar si una cadena es una URL HTTP válida?] (Http://stackoverflow.com/questions/7578857/how-to-check-whether-a-string-is-a-valid-http -url) – Amalea

Respuesta

53

Un URI bien formado implica la conformidad con ciertos RFC. La ruta local en su ejemplo no concuerda con estos. Lea más en la documentación IsWellFormedUriString.

Un resultado falso de ese método no implica que la clase Uri no pueda analizar la entrada. Si bien la entrada de URI puede no ser conforme a RFC, aún puede ser un URI válido.

actualización: Y para responder a su pregunta - como muestra la documentación Uri, hay un método estático llamado TryCreate que intentará exactamente lo que quiere y devolver verdadero o falso (y el real Uri ejemplo, si es cierto).

+0

La pregunta es "¿Cómo se comprueba que una cadena uri es válida (que se puede alimentar al constructor Uri)?" – Manuel

+1

TryCreate realmente no le dice si el constructor aceptará una cadena. Ver actualización. – Manuel

+0

@Manuel: eso no tiene ningún sentido - el resultado de 'TryCreate' y el constructor' Uri' deben ser idénticos - intenta pasar el 'UriKind' como lo hiciste con' TryCreate'. – BrokenGlass

0

En su caso, el argumento URI es una ruta absoluta que se refiere a la ubicación del archivo, así como por el doctor del método devuelve falso. Consulte this

+0

Estoy usando UriKind.RelativeOr Absolute por lo que no debería importar. De cualquier manera, no funciona con UriKind.Relative o UriKind.Absolute, así que no hay suerte allí. – Manuel

25

Dado que la respuesta aceptada no proporciona un ejemplo explícito, aquí hay un código para validar los URI en 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

¡No confíes en la función Uri.TryCreate! Esto también permitirá URLs incorrectas. Pruebe esto 'http: // http: // google.com/page' (eliminar espacios). Esta URL pasa la función TryCreate, pero está mal. – No1Lives4Ever

+2

@ No1Lives4Ever Tiene razón en que analiza como válido lo que mencionó, pero esto técnicamente no es incorrecto. La explicación en inglés: usando el protocolo http (** http: // **), conéctese a la entrada DNS para "http" (http: // ** http **) usando un puerto explícito (pero omitido) (http : // http **: **) - así que asumiré el valor predeterminado para el protocolo; usted proporcionó una carpeta vacía de primer nivel (http: // http: ** // **) pero sé lo que quería decir;) seguido de un segmento de ruta "google.com" (http: // http: // ** google.com/**) y luego la "página" de recursos (http: // http: //google.com/**page**) – mlhDev

3

Suponiendo que sólo queremos apoyar absolutos peticiones de URI y HTTP, aquí es una función que hace lo que quiere:

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

De acuerdo con las fuentes de .Net [su segundo cheque **! Uri.TryCreate (uri, UriKind.Absolute, out tmp) ** es redundante porque el método IsWellFormedUriString ya contiene la llamada al método TryCreate] (http://referencesource.microsoft.com/#System/net/System/UriExt.cs,24b1613846e7f879) –

+0

The Se necesita un segundo control para hacer posible el tercer (y último) control. Sin él, no hay 'tmp'. El primer paso es discutiblemente redundante en este caso ... – Joe

Cuestiones relacionadas