理由スラッシュを使用すると違いが生じます new URI(baseUri、relativePath) ?
このコンストラクターは、baseUriとrelativeUriを組み合わせてUriインスタンスを作成します。
そして、how相対パスを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に末尾のスラッシュがない場合でも、目的の出力は「適切な」ケースです。
新しい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
ではありません。
より具体的には、これは RFC 3986 のセクション5.2.3に従います。
5.2.3。パスをマージする
上記の擬似コードは、相対パス参照をベースURIのパスとマージするための「マージ」ルーチンを参照しています。これは次のように実行されます。
ベースURIに定義済みの権限コンポーネントと空のパスがある場合は、参照のパスと連結された「/」で構成される文字列を返します。さもないと、
参照のパスコンポーネントで構成される文字列を返しますベースURIのパスの最後のセグメントを除くすべてに追加(つまり、ベースURIパスの右端の「/」の後の文字を除外するか、除外します「/」文字が含まれていない場合は、ベースURIパス全体)。
オーバーロードnew Uri(baseUri, relativePath)
を使用してURIコンストラクターをいじっています。おそらく他の人は結果が役に立つと思うかもしれません。これが私が書いたテストアプリケーションからの出力です:
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)