结合3个URI的意外结果

时间:2014-02-25 13:14:43

标签: c# .net http url uri

我有以下代码来连接一些URI:

public static Uri BuildUri()
{
    Uri baseUri = new Uri("http://192.168.1.60:8080");
    Uri restUri = new Uri(baseUri, "/rest/api/2");
    Uri url = new Uri(restUri, "/mypreferences?key=my.config.value");

    return url;
}

我希望结果URI中有以下地址:

http://192.168.1.60:8080/rest/api/2/mypreferences?key=my.config.value

但我得到了:

http://192.168.1.60:8080/mypreferences?key=my.config.value

请有人解释原因吗?

4 个答案:

答案 0 :(得分:2)

试试这个,即你需要更改最后一个网址。您正在传递baseUri但是您应该通过restUri

Uri baseUri = new Uri("http://192.168.1.60:8080");
Uri restUri = new Uri(baseUri, "/rest/api/2/");
Uri url = new Uri(restUri, "mypreferences?key=my.config.value");   
                   ^^^^^^---Here

答案 1 :(得分:2)

void Main()
{
    Uri baseUri = new Uri("http://192.168.1.60:8080");
    Uri restUri = new Uri(baseUri, "/rest/api/2/");
    Uri url = new Uri(restUri, "mypreferences?key=my.config.value");

    Console.WriteLine (url);
}

这正确打印

http://192.168.1.60:8080/rest/api/2/mypreferences?key=my.config.value

差别必须是因为它如何解释不同URI中的正斜杠。在我尚未找到的文档中提到了这一点,但至少你已经有了解决方案。

答案 2 :(得分:1)

您在创建restUri和url时都使用baseUri。你可能打算这样做:

public static Uri BuildUri()
{
    Uri baseUri = new Uri("http://192.168.1.60:8080");
    Uri restUri = new Uri(baseUri, "rest/api/2");
    Uri url = new Uri(restUri, "mypreferences?key=my.config.value");
    return url;
}

使用baseUri创建restUri并使用restUri创建最终的url。还要注意我是如何省略子网址中的主斜杠的。 Uri类将为您处理正确的连接。

答案 3 :(得分:1)

相关:Appending multiple segments with System.Uri

您希望在路径的末尾添加/,并将其从第一个路径中删除。

Uri baseUri = new Uri( "http://192.168.1.60:8080" );
Uri restUri = new Uri(baseUri, "/rest/api/2/");