web-dev-qa-db-ja.com

ベースURIと相対パスから新しいURIを作成します-スラッシュは違いを生みますか?

理由スラッシュを使用すると違いが生じます 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に末尾のスラッシュがない場合でも、目的の出力は「適切な」ケースです。

19
user2864740

新しい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パス全体)。

17
Jon Skeet

オーバーロード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)
9
Simon Tewsi