Создать новый 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)