2011-11-13 16 views
3

thirdRelativeUriが失敗するのはなぜですか?これは.NETのバグですか? 4.0でも修正されていないようです。Uriコンストラクタ.NET Frameworkバグ?

var googleU = new Uri("http://www.google.com"); 
var secondRelativeUri = new Uri(googleU,"//test.htm"); // doesn't fail 
var thirdRelativeUri = new Uri(googleU,"///test.htm"); // fails - Invalid URI: The hostname could not be parsed. 

UPDATE:

var thirdRelativeUri = new Uri("///test.htm",UriKind.Relative); // works as expected 
var newUri = new Uri(googleU,thirdRelativeUri); //Fails, same error even though it's a relative URI 

それが失敗した:

@dariomは理にかなっている.NETでの取り扱いプロトコル相対URLは、しかし、これはまだ私にはバグのようですので、これがあることを指摘しました2番目のウリがあってもRelative

+0

なぜ "///test.htm"ではなく "//test.htm"を渡すのですか? –

+0

@DavidePiras原因私は悪いですか?私は以下の要求をする必要があります:http://example.com///test.htm完璧な世界でexample.com/test.htmとexample.com///test.htmは違いはありませんが実際残念ながら、Webサーバーとフレームワークは非常識で、数千ものものがあります。 –

+0

私は@ dr.evilに同意します。構文解析では、無用なディレクトリ/パス区切り文字を受け入れる必要があります。 – leppie

答えて

2

私はコンストラクタが"//test.htm"は、スキームなしでホスト名が、test.htmであるURIとして指定します。これは、secondRelativeUriの値を調べることで確認できます - "http://test.htm/"です。

作成している3番目のURIは、スラッシュが多すぎるため無効です。

+1

補足として、 '//'で始まるURIはプロトコル相対URIと呼ばれます。 – svick

+0

まあ、私が明示的に.netに伝えると、それはまだ動作しない相対URIです。質問が更新され、新しいコードサンプルが追加されました。 –

5

ファイルURIスキーム(RFC 1738)file:// [host]/pathは、そのホストがオプションであることを示しています。 「これは通常、RFC 1738からホストが起動トリプル/につながることが多い空でローカルファイルを使用するので(ref)。」///test.htmlは意味します

変更///test.htmへのファイル: ///test.htmであり、URIコンストラクタが正しく解析します。 AbsolutePath/test.htmlになります。

これが役に立ちます。

0

新しいウリ(googleU、 "//のTest.htm")を意味ウリ= http://test.html//*有効な、とにかくルートのどこか*/

新しいウリ(googleU、 "///のTest.htm")を意味しますUri = http:///test.html//*無効、意味無し*/

新しいUri( "/// test.htm"、UriKind.Relative); // => Uri = ///test.htm同じ間違いで、相対位置ではない

var r =新しいUri( "test.htm"、UriKind.Relative);

新しいUri(googleU、r); // => Uri =

+0

これはどのようにして質問に答えますか? – BoltClock

+0

あなたは見ませんか? – BLUEPIXY

0

相対URLを作成する場合でも、.netは「//example.org/document」のようにホスト名としてスラッシュで始まる文字列を扱います。同様に3つのスラッシュは混乱を招き、例外がスローされます。これらの//test.htmと///test.htmがパスであることを確信している場合は、UriBuilderクラスを使用してみることができます。