2012-08-14 6 views
7

En las siguientes pruebas, ¿por qué (solo) falla la última?Uri.IsWellFormedUriString para la compatibilidad relativa con las URL Hashbang

[Fact] 
    public void IsWellFormedUriString_AbsolutNonHashTagUri_ReturnsTrue() 
    { 
     Assert.True(Uri.IsWellFormedUriString("http://www.RegularSite.org/Home", UriKind.Absolute)); 
    } 

    [Fact] 
    public void IsWellFormedUriString_RelativeNonHashTagUri_ReturnsTrue() 
    { 
     Assert.True(Uri.IsWellFormedUriString("Home", UriKind.Relative)); 
    } 

    [Fact] 
    public void IsWellFormedUriString_AbsolutHashTagUri_ReturnsTrue() 
    { 
     Assert.True(Uri.IsWellFormedUriString("http://www.w3.org/#!Home", UriKind.Absolute)); 
    } 

    [Fact] 
    public void IsWellFormedUriString_RelativeHashTagUri_ReturnsTrue() 
    { 
     // Fails! 
     Assert.True(Uri.IsWellFormedUriString("#!Home", UriKind.Relative)); 
    } 

Si Uri reconoce Hashbangs en la versión absoluta de IsWellFormedUriString, ¿por qué no en la versión relativa? ¿Qué me estoy perdiendo?

Nota: This no ayuda.

Respuesta

3

La razón por la que esto no está funcionando como era de esperar es porque un hashbang no es parte del URI Scheme. El método espera la parte jerárquica del formato URI y una marca hash (y posteriormente un hashbang) no es un miembro de la parte jerárquica desde la que se determina una ruta relativa y absoluta.

<> es una parte requerida
[] es una parte opcional

<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]

como un ejemplo de un URI absoluto; la consulta, si no me equivoco se ignora, que incluye la marca fragmento y el hash

http://domain.com/path/to/something/?query=1#fragment

Aquí hay más información para usted también. Esto es todo desde el MSDN que describe el método Uri.IsWellFormedUriString()

Indica si la cadena está bien formado por el intento de construir un URI con la cadena y asegura que la cadena no requiere escapar más.

Observaciones:

Por defecto, la cadena se considera bien formado, de acuerdo con RFC 2396 y RFC 2732. Si el Analizador de identificadores internacionales de recursos (IRI) o el Nombre de dominio internacionalizado (IDN) está habilitado, la cadena se considera bien formada de acuerdo con RFC 3986 y RFC 3987.

es considerada la cadena de mala formación, haciendo que el método devuelva falso, si alguna de las siguientes condiciones

Los siguientes son algunos ejemplos de fracaso:

http://www.contoso.com/path???/file nombre
La cadena no se escaparon correctamente .

c: \ directory \ filename
La cadena es un Uri absoluto que representa un archivo implícito Uri.

file: // c:/directory/filename
La cadena es un URI absoluto que falta una barra antes de la ruta.

http: \ host/path/archivo
La cadena contiene barras invertidas sin escape incluso si van a ser tratados como barras diagonales

www.contoso.com/path/file
La cadena representa un URI absoluto jerárquica y no contiene ": //"

+0

Gracias por la respuesta detallada, pero según ella - la tercera prueba debería haber fallado, y no es así. Esto no responde mi pregunta. – seldary

+0

@seldary No, la tercera prueba pasaría porque tiene 'http: // www.w3.org /' como un Uri absoluto que es suficiente para que pase porque detecta '#' como el inicio de un fragmento y '! Home' como el fragmento de texto, por lo tanto, pasa. – vane

Cuestiones relacionadas