Создать новый URI из базового URI и относительного пути - слэш делает разницу?
Почему слэш имеет значение при использовании нового URI (baseUri, relativePath)?
Этот конструктор создает экземпляр Uri, комбинируя baseUri и relativeUri..
И как можно добавить безопасный/последовательный относительный путь к 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
Желаемый результат - "хороший" случай, даже если исходный URI не имеет завершающей косой черты.
Ответы
Ответ 1
Почему слэш имеет значение при использовании нового URI (baseUri, relativePath)?
Хорошо, что обычно происходит в Интернете.
Например, предположим, что я смотрю на http://foo.com/some/file1.html
и там есть ссылка на file2.html
- эта ссылка идет на http://foo.com/some/file2.html
, правильно? Не http://foo.com/some/file1.html/file2.html
.
Более конкретно, это следует из раздела 5.2.3 RFC 3986.
5.2.3. Пути слияния
Псевдокод выше относится к процедуре "слияния" для слияния относительный путь с указанием пути к базовому URI. Это выполняется следующим образом:
-
Если базовый URI имеет определенный компонент полномочий и пустой путь, затем верните строку, состоящую из "/" , объединенную с опорный путь; в противном случае,
-
возвращает строку, состоящую из компонента опорного тракта добавляется ко всем, кроме последнего сегмента базового пути URI (то есть, исключая любые символы после самого правого "/" в базовом URI путь или исключить весь базовый путь URI, если он не содержит любые символы "/" ).
Ответ 2
Я играл с конструктором Uri с перегрузкой new Uri(baseUri, relativePath)
. Возможно, другие могут найти полезные результаты. Здесь вывод из тестового приложения я написал:
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)