2011-11-13 68 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:

@dariom指出,這是因爲協議相對URL在.NET處理這道理然而,這似乎仍然越野車對我說:

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 

它失敗即使當第二個Uri是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」作爲URI,沒有方案,主機名爲test.htm。您可以通過檢查secondRelativeUri的值 - 它是「http://test.htm/」來查看。

您創建的第三個URI無效,因爲您的斜槓太多。

+1

作爲一個附註,以'//開頭的URI被稱爲協議相對URI。 – svick

+0

當然,當我明確地告訴.net它是一個相對URI時它仍然不起作用。更新了問題,添加了一個新的代碼示例。 –

5

文件uri方案(RFC 1738)file:// [host]/path顯示主機是可選的。 ///test.html將意味着「因爲這通常用於本地文件從RFC 1738的主機通常是空的,導致起始三重/ (ref)。」

變化///test.htm文件: ///test.htm和URI構造函數將正確解析它。這是AbsolutePath將是/test.html

希望這會有所幫助。

0

新URI(googleU, 「// TEST.HTM」)的意思是URI = http://test.html//*有效,反正根某處*/

新URI(googleU 「/// TEST.HTM」)是指Uri = http:///test.html//*無效,無意義*/

new Uri(「/// test.htm」,UriKind.Relative); // => Uri = ///test.htm同樣的錯誤,而不是相對位置

var r = new Uri(「test.htm」,UriKind.Relative);

new Uri(googleU,r); // => Uri = http://www.google.com/test.htm

+0

這是如何回答這個問題的? – BoltClock

+0

你不明白嗎? – BLUEPIXY

0

即使在創建相對URL時,.net也會將一個以雙斜線開頭的字符串視爲「//example.org/document」中的主機名稱。同樣,三個slahes會造成混亂,並引發異常。如果您確信這些//test.htm和///test.htm是路徑,那麼您可以嘗試使用UriBuilder類。