2010-09-09 11 views
9

Necesito un método de validación Uri. Así, cadenas como:Validación de Uri desde la Cadena

"http://www.google.com", "www.google.com", "google.com"

..must ser validados como Uri. Y también cadenas normales como "google" no deben validarse como Uri. Para hacer esta comprobación, utilizo dos métodos: UriBuilder y Uri.TryCreate().

El problema con UriBuilder es que cualquier cadena que le dé, devuelve un Uri fuera de ella. Cuando paso una cadena normal en su constructor, le da un esquema y devuelve "http://google/", que no es el comportamiento que quiero.

El problema con Uri.TryCreate() es que, aunque funciona bien con "http://www.google.com" y "www.google.com", cuando lo doy "google.com" no se valida como un URI.

Pensé en hacer verificaciones en la cadena, si comienza con http: // o www, envíe la cadena a la clase UriBuilder, pero esto no ayuda con "google.com", que también debe ser un Uri.

¿Cómo puedo validar cosas como "google.com" como un URI, pero no como "google"? Comprobar el final de la cadena para .com, .net, .org no parece flexible.

+2

¿Puedes verificar si estás buscando validar una URL o un URI? Tu pregunta es algo confusa. – slugster

+0

@Slugster - después de leer su pregunta, verifiqué en línea para entender la diferencia, por lo que la respuesta es que necesito validar un URI, no una URL. –

Respuesta

5
public static bool IsValidUri(string uriString) 
{ 
    Uri uri; 
    if (!uriString.Contains("://")) uriString = "http://" + uriString; 
    if (Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out uri)) 
    { 
     if (Dns.GetHostAddresses(uri.DnsSafeHost).Length > 0) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
+1

El protocolo puede ser [varias otras cosas] (http://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Examples_of_absolute_URIs) que no sean HTTP. – slugster

+0

@slugster: Es por eso que él comprueba si ya tiene un protocolo ... solo lo establece en http si no es el más común y es bastante seguro. – mpen

+0

Gracias por su código. Sin embargo, este código crea un Uri a partir de una sola palabra: si paso "google", recibo a cambio "http: // google /", que no es lo que necesito. También me gustaría evitar construir la lógica del código en construcciones try/catch. –

15

Lo que estás buscando es Uri.IsWellFormedUriString. El siguiente código devuelve verdadero:

Uri.IsWellFormedUriString("google.com", UriKind.RelativeOrAbsolute) 

Si establece UriKind al Absoluto, devuelve falso:

Uri.IsWellFormedUriString("google.com", UriKind.Absolute) 

EDIT: Ver here para UriKind enumeración.

  • RelativeOrAbsolute: El tipo de Uri es indeterminado.
  • Absoluto: El Uri es un Uri absoluto.
  • Relativo: El Uri es un Uri relativo.

De MSDN documentation:

Absolute URIs se caracterizan por una referencia completa al recurso (ejemplo: http://www.contoso.com/index.html), mientras que un URI relativa depende de una base previamente definido URI (ejemplo: /index.html)

También, vea here para Uri.IsWellFormedUriString. Este método funciona de acuerdo con RFC 2396 y RFC 2732.

Si mira RFC 2396, verá que google.com no es un URI válido. De hecho, www.google.com no es ninguno de los dos. Pero bajo F. abreviada URL, este situtation se explica en detalle como sigue:

La sintaxis URL fue diseñado para referencia inequívoca a la red recursos y extensibilidad mediante el esquema de URL.Sin embargo, como la identificación y el uso de la URL se han vuelto comunes, los medios tradicionales (televisión, radio, periódicos, vallas publicitarias, etc.) tienen cada vez más referencias bibliográficas abreviadas de URL . Es decir, una referencia que consiste en solo las porciones de autoridad y ruta del recurso identificado, como como www.w3.org/Addressing/ o simplemente el nombre de host DNS por sí mismo. Dichas referencias son principalmente destinadas a interpretación humana en lugar de máquina, con la suposición de que las heurísticas basadas en contexto son suficientes para completar el URL (por ejemplo, la mayoría de los nombres de host que comienzan con "www" probablemente tengan un prefijo de URL de "http : // "). Aunque no existe un conjunto estándar de heurísticas para la eliminación de ambigüedades de las referencias URL abreviadas, muchas implementaciones de clientes les permiten ser ingresadas por el usuario y resueltas heurísticamente. Cabe señalar que dichas heurísticas pueden cambiar con el tiempo, particularmente cuando se introducen nuevos esquemas de URL. Dado que una URL abreviada tiene la misma sintaxis que una ruta de URL relativa, las referencias URL abreviadas no se pueden usar en contextos donde se esperan URL relativas . Esto limita el uso de URL abreviadas a los lugares donde no hay una URL base definida, como los cuadros de diálogo y los anuncios fuera de línea .

Lo que entiendo por eso es que Uri.IsWellFormedUriString acepta cadenas que están en forma de www.abc.com como URI válidas. Pero google.com no se acepta como un URI absoluto, mientras que se acepta como un URI relativo porque cumple con la especificación de ruta relativa (las rutas pueden contener).

Además, como nota al margen, si desea usar una expresión regular para analizar un URI, puede leer B. Analizar una referencia de URI con una expresión regular.

+0

gracias por su respuesta. Este método es interesante, valida "google.com", que es excelente, sin embargo valida una sola palabra ("google") como un uri bien formado también, que no necesito. Respuesta útil, no obstante, –

+0

@Andrei: He actualizado mi respuesta. La respuesta está en RFC 2396. – Zafer

+0

Gracias por esto, he leído más sobre Uri.IsWellFormedUriString y creo que entiendo por qué valida "google" como Uri válido. Entonces, lo que necesito, supongo, es una forma de verificar si el final de la cadena tiene un .com, .net, ..etc adjunto. Soy reacio a utilizar Regular Exp en esto porque pueden tener fallas, y si en el futuro alguien inventa una extensión popular como ".zedo", por ejemplo, mi regExp no lo detectará ya que solo manejará terminaciones conocidas (.net, .com etc.). –

2

use RegExp para esto.

Código de la muestra de validación de direcciones URL

Regex RgxUrl = new Regex("(([a-zA-Z][0-9a-zA-Z+\\-\\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?"); 
    if (RgxUrl.IsMatch(<yourURLparameter>)) 
    { 
     //url is valid 
    } 
    else 
    { 
     //url is not valid 
    } 
3

se trata de una variante del código de Jojoba a quien agradezco el comprobador de DNS, que era lo que necesitaba. el único problema es que usa una captura de prueba en su lógica que esperaba evitar.

 public static Uri StringToAbsoluteUri(string uriString) 
     { 
     Uri resultUri = null; 

     if (!uriString.Contains(Uri.SchemeDelimiter)) 
      uriString = Uri.UriSchemeHttp + Uri.SchemeDelimiter + uriString; 

     if (Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out resultUri)) 
     { 
      try 
      { 
       IPAddress[] addressesOfHost = Dns.GetHostAddresses(resultUri.DnsSafeHost); 
       if (addressesOfHost.Length > 0) 
       { 
        return resultUri; 
       } 
      } 
      catch (System.Net.Sockets.SocketException) 
      { 
       return null; 
      } 
     } 
     return resultUri; 
     } 
Cuestiones relacionadas