2009-11-25 56 views
5

我需要合併兩個包含.Path信息的URL。合併兩個URI時路徑部分被覆蓋

我想使用Uri給我的可能性.TryCreate(),所以我可以捕獲格式不正確的URL。

,我現在面臨的問題是,基礎URI路徑似乎當我合併絕對和相對URI被忽略:

Uri absoluteUri= new Uri("http://hostname/path/", UriKind.Absolute); 
Uri relativeUri = new Uri("/my subsite/my page.aspx?my=query", UriKind.Relative); 
Uri resultUri; 
if (!Uri.TryCreate(absoluteUri, relativeUri, out resultUri)) 
     // handle errors 

的上面的輸出是:

http://hostname/my%20subsite/my%20page.aspx?my=query 

我希望它是:

http://hostname/path/my%20subsite/my%20page.aspx?my=query 

有沒有一種方法來組合URL th包含使用Uri類的路徑信息?

回答

12

你相對URI相對應,即刪除第一個斜槓(或增加一個週期),

string relative = "/my subsite/my page.aspx?my=query"; 

Uri test1= new Uri(relative.Substring(1), UriKind.Relative); // without 'root' 
Uri test2= new Uri("." + relative, UriKind.Relative);  // with 'current' 

工作例如:

Uri baseUri = new Uri("http://hostname/path/"); 
string relative = "/my subsite/my page.aspx?my=query"; 

Uri test1 = new Uri(baseUri, relative);    // original string 
Uri test2 = new Uri(baseUri, relative.Substring(1)); // without 'root' character 
Uri test3 = new Uri(baseUri, "." + relative);  // with 'current' character 

Console.WriteLine(test1.OriginalString); // wrong 
Console.WriteLine(test2.OriginalString); // right! 
Console.WriteLine(test3.OriginalString); // right! 

所以,你應該處理您的相對部分像這樣:

if (relative.StartsWith("/")) 
    relative = "." + relative; 
+0

你試過這個嗎?當我做的時候沒有什麼區別。 – 2009-11-25 10:59:01

+0

@anders,是的,適合我;我用一個完整的例子來編輯我的答案;請看看 – 2009-11-25 12:13:50

+3

啊,我發現了什麼使你的代碼工作,而不是我的: 看來,絕對的網址也必須以/結束它的工作! 我用 字符串absoluteUrl =「http://主機名/路徑」; 它並沒有工作,但在「路徑」後兩端都是slahs,在「my」之前沒有開始斜線,似乎可以工作! 這看起來很脆,所以生病了多一點,但你應該得到這個答案:-) – 2009-11-25 12:35:35