¿Cómo se comprueba que una cadena de uri es válida (que se puede alimentar al constructor de Uri)?
Hasta ahora solo tengo lo siguiente, pero por razones obvias prefiero una forma menos bruta:
Boolean IsValidUri(String uri)
{
try
{
new Uri(uri);
return true;
}
catch
{
return false;
}
}
Probé Uri.IsWellFormedUriString pero no parece gustarle 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 Uri usa kind Absolute por defecto. Esto estaba causando una discrepancia cuando intenté usar Uri.TryCreate y el constructor. Obtiene el resultado esperado si hace coincidir el UriKind tanto para el constructor como para TryCreate.
TryCreate
y elUri
constructor deberían ser idénticos - intenta pasar loUriKind
que hicisteTryCreate
.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... }
fuente
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; }
fuente
tmp
. El primer paso es posiblemente redundante en este caso ...En mi caso, solo quería probar el uri, no quiero ralentizar la aplicación que prueba el uri.
Boolean IsValidUri(String uri){ return Uri.IsWellFormedUriString(uri, UriKind.Absolute); }
fuente
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 este
fuente