【问题标题】:Unexpected result combining 3 URIs组合 3 个 URI 的意外结果
【发布时间】:2025-12-24 19:50:12
【问题描述】:

我有以下代码来连接一些 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

谁能解释一下原因?

【问题讨论】:

    标签: c# .net http url uri


    【解决方案1】:

    试试这个,即,你需要更改最后一个 url。您正在传递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
    

    【讨论】:

    • 哎哟!愚蠢的错误。谢谢
    • 我已经改变了你所说的并且得到了相同的结果。我要重新做一遍这个问题。
    【解决方案2】:

    您在创建 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】:

      相关:Appending multiple segments with System.Uri

      您想将 / 附加到路径的末尾,并将其从第一个路径中删除。

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

      【讨论】:

        【解决方案4】:
        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 中的正斜杠。在我还没有找到的文档中确切地提到了这一点,但至少你已经有了你的解决方案。

        【讨论】: