Uri (Clase)
Actualización: noviembre 2007
Proporciona una representación de objeto de un identificador de recursos uniforme (URI) y un acceso sencillo a las partes del identificador URI.
Ensamblado: System (en System.dll)
Un identificador URI es una representación compacta de un recurso disponible para la aplicación en la intranet o en Internet. La clase Uri define las propiedades y los métodos necesarios para controlar los identificadores URI, incluidos el análisis, la comparación y la combinación. Las propiedades de la clase Uri son de sólo lectura; para crear un objeto modificable, use la clase UriBuilder.
Los identificadores URI relativos (por ejemplo, "/new/index.htm") deben expandirse con respecto a un identificador URI base para que pasen a ser absolutos. Se proporciona el método MakeRelative para convertir identificadores URI absolutos en identificadores URI relativos cuando sea necesario.
Los constructores de Uri no utilizan secuencias de escape en las cadenas del identificador URI si la cadena tiene el formato correcto e incluye un identificador de esquema.
Las propiedades de Uri devuelven una representación de datos canónica con codificación de escape, y todos los caracteres cuyos valores Unicode sean mayores que 127 se sustituyen por sus equivalentes hexadecimales. Para poner el identificador URI en formato canónico, el constructor de Uri realiza los pasos siguientes.
-
Convierte a minúsculas el esquema del identificador URI.
-
Convierte a minúsculas el nombre de host.
-
Si el nombre de host es una dirección IPv6, se utiliza la dirección IPv6 canónica. Se quitan ScopeId y otros datos opcionales de IPv6.
-
Quita los números de puertos vacíos y predeterminados.
-
Canoniza la ruta de acceso de los identificadores URI jerárquicos mediante la compactación de secuencias como /./, /../, //, incluidas las representaciones con secuencias de escape. Observe que hay algunos esquemas para los que no se compactan las representaciones de escape.
-
Para los identificadores URI jerárquicos, si el host no finaliza con una barra diagonal (/), se agrega una.
-
A cualquier carácter reservado del identificador URI se le aplican las secuencias de escape establecidas en RFC 2396.
Como parte de la canonización en el constructor para algunos esquemas, se compactan las representaciones de escape. Los esquemas para los que el identificador URI compactará las secuencias de escape son los siguientes: file, http, https, net.pipe y net.tcp. Para todos los demás esquemas, no se compactan las secuencias de escape. Por ejemplo, si se codifica con un símbolo de porcentaje los dos puntos ".." como "%2E%2E", el constructor de URI compactará esta secuencia para algunos esquemas. En el ejemplo de código siguiente se muestra un constructor de URI para el esquema http.
Uri uri = new Uri("http://myUrl/%2E%2E/%2E%2E");
Console.WriteLine(uri.AbsoluteUri);
Console.WriteLine(uri.PathAndQuery);
Cuando se ejecuta este código, se devuelve el resultado siguiente con la secuencia de escape compactada.
http://myUrl/ /
En el ejemplo de código siguiente se muestra un constructor de URI para el esquema ftp:
Uri uri = new Uri("ftp://myUrl/%2E%2E/%2E%2E");
Console.WriteLine(uri.AbsoluteUri);
Console.WriteLine(uri.PathAndQuery);
Cuando se ejecuta este código, se devuelve el resultado siguiente con la secuencia de escape sin compactar.
ftp://myUrl/%2E%2E/%2E%2E /%2E%2E/%2E%2E
El método ToString permite transformar el contenido de la clase Uri de una referencia de identificador URI con códigos de escape en una referencia de identificador URI legible. Observe que algunos caracteres reservados todavía podrían contener secuencias de escape en los resultados del método ToString. El motivo es facilitar la reconstrucción inequívoca de un identificador URI a partir del valor devuelto por ToString.
Algunos identificadores URI incluyen un identificador de fragmento, una consulta o ambos. Un identificador de fragmento es cualquier texto precedido por el signo de número (#), sin incluirlo; el texto del fragmento se almacena en la propiedad Fragment. La información de consulta es el texto situado detrás de un signo de interrogación de cierre (?) en el identificador URI; el texto de consulta se almacena en la propiedad Query.
En la versión 1.1 de .NET Framework, si la cadena especificada para un constructor contiene un esquema desconocido y "c:\", la clase Uri inserta "//" después de los dos puntos. Por ejemplo, xyz:c:\abc se convierte en xyz://c:/abc. En la versión 2.0 de .NET Framework, este comportamiento ya no existe, por lo que la cadena del ejemplo se convertiría en xyz:c:/abc.
Nota: |
|---|
La clase URI admite el uso de direcciones IP en notaciones de cuatro números para el protocolo IPv4 y notaciones hexadecimales con dos puntos para el protocolo IPv6. Recuerde incluir la dirección IPv6 entre corchetes, como en http://[::1]. |
Compatibilidad con los identificadores de recursos internacionales
Las direcciones web se suelen expresar con identificadores uniformes de recursos que están compuestos por un conjunto de caracteres muy restringido:
Letras ASCII mayúsculas y minúsculas del alfabeto inglés.
Dígitos de 0 a 9.
Un número pequeño de otros símbolos ASCII.
Las especificaciones para los URI figuran en los documentos RFC 2396 y RFC 3986 publicados por el grupo de trabajo de ingeniería de Internet IETF (Internet Engineering Task Force).
Con el desarrollo de Internet, hay una necesidad creciente de identificar los recursos con idiomas que no sean el inglés. Los identificadores que facilitan esta necesidad y permiten caracteres distintos de ASCII (caracteres del juego de caracteres Unicode/ISO 10646) se conocen como identificadores de recursos internacionales (IRI). Las especificaciones para los IRI figuran en el documento RFC 3987 publicado por el IETF. Los IRI permiten que las direcciones URL contengan caracteres Unicode.
La clase Uri existente se ha extendido en .NET Framework v3.5, 3.0 SP1 y 2.0 SP1 para proporcionar compatibilidad con los identificadores de recursos internacionales (IRI) basados en RFC 3987. Los usuarios actuales no verán ningún cambio respecto al comportamiento de .NET Framework 2.0, a menos que habiliten IRI específicamente. De este modo, se garantiza la compatibilidad de la aplicación con las versiones anteriores de .NET Framework.
Para habilitar la compatibilidad con los IRI, es preciso realizar los dos siguientes cambios:
Agregar la siguiente línea al archivo machine.config bajo el directorio de .NET Framework 2.0
<section name="uri" type="System.Configuration.UriSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
Especificar si se desea aplicar el análisis IDN (nombres de dominio internacionalizados) al nombre de dominio y si deben aplicarse las reglas de análisis IRI. Esto puede especificarse en el archivo machine.config o app.config. Por ejemplo, agregue el siguiente código:
<configuration> <uri> <idn enabled="All" /> <iriParsing enabled="true" /> </uri> </configuration>
Al habilitar IDN, todas las etiquetas Unicode en un nombre de dominio se convertirán a sus equivalentes Punycode. Los nombres Punycode sólo contienen caracteres ASCII y siempre empiezan con el prefijo xn--. De este modo, se admiten los servidores DNS existentes en Internet, dado que la mayoría de estos servidores sólo admiten caracteres ASCII (vea RFC 3940).
Al habilitar IRI e IDN, el valor de la propiedad Uri.DnsSafeHost se ve afectado. Al habilitar IRI e IDN, también puede cambiar el comportamiento de los métodos Equals, OriginalString, GetComponents e IsWellFormedOriginalString.
Hay tres valores posibles para IDN según los servidores DNS que se usen:
idn enabled = All
Este valor convierte cualquier nombre de dominio Unicode a su equivalente Punycode (nombres IDN).
idn enabled = AllExceptIntranet
Este valor convertirá todos los nombres de dominio Unicode que no estén en la intranet local para que se utilicen sus equivalentes (nombres IDN). En este caso, para administrar los nombres internacionales en la intranet local, los servidores DNS que se utilizan para la intranet deben admitir la resolución de nombres Unicode.
idn enabled = None
Este valor no convierte ningún nombre de dominio Unicode para que se use Punycode. Éste es el valor predeterminado que es coherente con el comportamiento de .NET Framework 2.0.
Al habilitar el análisis IRI (iriParsing enabled = true), la normalización y la comprobación de caracteres se realizarán de acuerdo con las últimas reglas IRI de RFC 3987. El valor predeterminado es false, por lo que la normalización y la comprobación de caracteres se realizarán de acuerdo con RFC 2396 y RFC 3986 (para literales de IPv6).
El procesamiento de IRI e IDN en la clase Uri también puede controlarse mediante las clases de valores de configuración System.Configuration.IriParsingElement, System.Configuration.IdnElement y System.Configuration.UriSection. El valor System.Configuration.IriParsingElement habilita o deshabilita el procesamiento de IRI en la clase Uri. El valor System.Configuration.IdnElement habilita o deshabilita el procesamiento de IDN en la clase Uri. El valor System.Configuration.IriParsingElement también controla IDN indirectamente. El procesamiento IRI debe estar habilitado para que el procesamiento IDN sea posible. Si el procesamiento IRI está deshabilitado, el procesamiento IDN se establece en el valor predeterminado, donde se usa el comportamiento de .NET Framework 2.0 por motivos de compatibilidad y no se usan los nombres IDN.
El valor de configuración para System.Configuration.IriParsingElement e System.Configuration.IdnElement se leerá una vez cuando se construya la primera clase System.Uri. Después de ese momento, se omitirán los cambios que se produzcan en los valores de configuración.
La clase System.GenericUriParser también se ha extendido para permitir la creación de un analizador personalizable que admita IRI e IDN. El comportamiento de un objeto System.GenericUriParser se especifica pasando al constructor de System.GenericUriParser una combinación bit a bit de los valores disponibles en la enumeración de System.GenericUriParserOptions. El tipo GenericUriParserOptions.IriParsing indica que el analizador admite las reglas de análisis especificadas en RFC 3987 para los identificadores de recursos internacionales (IRI). El uso de IRI viene determinado por los valores de configuración anteriormente mencionados.
El tipo GenericUriParserOptions.Idn indica que el analizador admite el análisis IDN (Nombres de dominio internacionalizados) de los nombres de host. El uso de IDN viene determinado por los valores de configuración anteriormente mencionados.
Consideraciones de rendimiento
Si utiliza un archivo Web.config que contiene identificadores URI para inicializar su aplicación, los URI tardarán más tiempo en procesarse si sus identificadores de esquema no son estándar. En tal caso, inicialice las partes afectadas de su aplicación cuando se requieran los URI, no en el inicio.
Por cuestiones de seguridad, la aplicación debe tener cuidado al aceptar instancias de Uri de los orígenes que no sean de confianza y con dontEscape establecido en true.Se puede comprobar la validez de una cadena de URI llamando al método IsWellFormedOriginalString.
Nota de la plataforma Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows CE:
.NET Compact Framework no diferencia entre rutas de acceso relativas y absolutas. Por otra parte, en .NET Compact Framework se procesan las cadenas URI que llevan antepuesto el esquema file:// de manera diferente que en la versión completa de .NET Framework. Una especificación file://myfile relativa se resuelve como \\myfile. Si se usa file:///myfile (tres barras diagonales), se resuelve como \myfile en el directorio raíz. Para que las operaciones se realicen correctamente, especifique información de ruta de acceso absoluta.
En el siguiente ejemplo se crea una instancia de la clase Uri y se utiliza para crear una instancia de WebRequest.
Uri siteUri = new Uri("http://www.contoso.com/"); WebRequest wr = WebRequest.Create(siteUri);
Uri siteUri = new Uri("http://www.contoso.com/");
WebRequest wr = WebRequest.Create(siteUri);
Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile para Smartphone, Windows Mobile para Pocket PC, Xbox 360
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Nota: