una sistemas ruta relativa qué que operativos ejemplo direccion archivo acceso absoluta c# .net uri trailing-slash

c# - sistemas - Cree un nuevo URI a partir del URI base y la ruta relativa: ¿una barra oblicua hace una diferencia?



ruta relativa c# (2)

¿Por qué una barra diagonal marca la diferencia cuando se usa un nuevo URI (baseUri, relativePath)?

Bueno, eso es lo que pasa en la web normalmente.

Por ejemplo, supongamos que estoy viendo http://foo.com/some/file1.html y hay un enlace a file2.html - ese enlace va a http://foo.com/some/file2.html , a la derecha ? No http://foo.com/some/file1.html/file2.html .

Más específicamente, sin embargo, esto sigue a la sección 5.2.3 de RFC 3986 .

5.2.3. Fusionar caminos

El pseudocódigo anterior se refiere a una rutina de "fusión" para fusionar una referencia de ruta relativa con la ruta del URI base. Esto se consigue de la siguiente manera:

  • Si el URI base tiene un componente de autoridad definido y una ruta vacía, entonces devuelva una cadena que consta de "/" concatenado con la ruta de la referencia; de otra manera,

  • devuelva una cadena que consiste en el componente de la ruta de referencia añadido a todos menos el último segmento de la ruta del URI base (es decir, excluyendo cualquier carácter después de la "/" más a la derecha en la ruta del URI base, o excluyendo la ruta URI base completa si no contiene ningún carácter "/").

¿ Por qué una barra diagonal marca la diferencia cuando se usa un nuevo URI (baseUri, relativePath) ?

Este constructor crea una instancia de Uri combinando la baseUri y la relativeUri.

Y, ¿cómo se puede agregar una ruta relativa de manera segura / consistente a una URI?

var badBase = new Uri("http://amee/noTrailingSlash"); var goodBase = new Uri("http://amee/trailingSlash/"); var f = "relPath"; new Uri(badBase, f) // BAD -> http://amee/relPath new Uri(goodBase, f) // GOOD -> http://amee/trailingSlash/relPath

El resultado deseado es el caso "bueno", incluso cuando el URI inicial no tiene una barra diagonal.


He estado jugando con el constructor de Uri con la new Uri(baseUri, relativePath) sobrecarga de new Uri(baseUri, relativePath) . Quizás otros puedan encontrar los resultados útiles. Aquí está el resultado de la aplicación de prueba que escribí:

A) Base Address is domain only ============================== NO trailing slash on base address, NO leading slash on relative path: http://foo.com + relative1/relative2 : http://foo.com/relative1/relative2 NO trailing slash on base address, relative path HAS leading slash: http://foo.com + /relative1/relative2 : http://foo.com/relative1/relative2 Base address HAS trailing slash, NO leading slash on relative path: http://foo.com/ + relative1/relative2 : http://foo.com/relative1/relative2 Base address HAS trailing slash, relative path HAS leading slash: http://foo.com/ + /relative1/relative2 : http://foo.com/relative1/relative2 B) Base Address includes path ============================= NO trailing slash on base address, NO leading slash on relative path: http://foo.com/base1/base2 + relative1/relative2 : http://foo.com/base1/relative1/relative2 (removed base2 segment) NO trailing slash on base address, relative path HAS leading slash: http://foo.com/base1/base2 + /relative1/relative2 : http://foo.com/relative1/relative2 (removed base1 and base2 segments) Base address HAS trailing slash, NO leading slash on relative path: http://foo.com/base1/base2/ + relative1/relative2 : http://foo.com/base1/base2/relative1/relative2 (has all segments) Base address HAS trailing slash, relative path HAS leading slash: http://foo.com/base1/base2/ + /relative1/relative2 : http://foo.com/relative1/relative2 (removed base1 and base2 segments)