Cómo comprobar que una cadena uri es válida

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

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

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

Intenté Uri.IsWellFormedUriString pero parece que no me gusta todo lo que puedes 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)); 

El resultado será:

 Uri.IsWellFormedUriString says: False IsValidUri says: True 

Actualizar / Responder

El constructor Uri usa Absolute tipo 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.

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 podrá 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 lo muestra la documentación de Uri, hay 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 verdadera).

Dado que la respuesta aceptada no proporciona un ejemplo explícito, aquí hay algún 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... } 

Suponiendo que solo queremos admitir solicitudes URI y HTTP absolutas, aquí hay una función que hace lo que desea:

 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; } 

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