2009-11-25 54 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