2012-11-26 87 views
19

我想從相對URI(即沒有任何方案或主機信息的URI)中提取查詢字符串和片段。解析相對URI

是否有一個更優雅的方式來做到這一點,而不是把它變成絕對URI與假主機名?

var relativeUri = "/dir1/dir2/file?a=b&c=d#fragment"; 
var uri = new Uri(new Uri("http://example.com"), relativeUri); 
var path = Uri.UnescapeDataString(String.Concat(uri.Segments)); 
var query = uri.Query; 
var fragment = uri.Fragment; 
// path = "/dir1/dir2/file", query = "?a=b&c=d", fragment = "#fragment" 

回答

12

雖然可以在沒有主機部分創建一個Uri,其大部分性能隨後將引發InvalidOperationException(「此操作不支持相對URI」),因爲這些屬性依賴於一個絕對URI 。

HttpUtility.ParseQueryString()在這裏確實不會有幫助,因爲它只對Uri的查詢部分進行操作,因爲你沒有絕對的Uri,所以你不能獲取它。

所以,雖然看起來好像很亂,但我覺得new Uri(baseUri, relativeUri) contstructor的確是你想要的。我似乎無法找到一個更好或更乾淨的方式來實現這一目標。

+0

事實上,'HttpUtility.ParseQueryString()'用相對URL的作品,以及。晚會有點晚 - 但正在檢查類似的東西:) – NomadTraveler

+1

@Nomad恐怕沒有。 'HttpUtility.ParseQueryString(「/ dir1/dir2/file?a = b&c = d#fragment」);'產生兩個結果:'/ dir1/dir2/file?a = b'和'c = d#fragment'絕對不是你感興趣的東西,你真的只需要傳遞一個查詢字符串。 – CodeCaster

0

我遇到了這個問題,我發現HttpUtility.ParseQueryString實際上只是尋找一個字符串和'?'之後的任何東西。

所以是,我在這兩種情況下使用這個(相對和絕對),我發現下面似乎工作得很好

HttpUtility.ParseQueryString(a.Attributes["href"].Value.Split('?').Last())