new c# .net uri

c# - new - Cómo comprobar que una cadena uri es válida



string to uri c# (4)

¿Cómo verifica que una cadena uri sea válida (para poder alimentarla al constructor Uri)?

Hasta ahora solo tengo lo siguiente, pero por razones obvias preferiría una forma menos brutal:

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

Intenté Uri.IsWellFormedUriString pero no parece que le guste todo lo que puede lanzar al 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

Actualizar / Responder

El constructor de Uri usa el tipo Absoluto por defecto. Esto causaba una discrepancia cuando intenté usar Uri.TryCreate y el constructor. Obtendrá el resultado esperado si coincide con UriKind tanto para el constructor como para TryCreate.


Dado que la respuesta aceptada no proporciona un ejemplo explícito, aquí hay algunos códigos para validar 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... }


En su caso, el argumento uri es una ruta absoluta que se refiere a una ubicación de archivo, por lo que según el documento del método devuelve falso. Refiérase a IsWellFormedUriString


Suponiendo que solo queremos admitir solicitudes URI y HTTP absolutas, aquí hay una función que hace lo que usted 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; }


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

Un resultado falso de ese método no implica que la clase Uri no podrá analizar la entrada. Si bien la entrada de URI puede no ser compatible con RFC, todavía puede ser una URI válida.

Actualización : y para responder a su pregunta, como muestra la documentación de Uri, existe un método estático llamado TryCreate que intentará exactamente lo que desea y devolverá verdadero o falso (y la instancia real de Uri si es verdadero).