6

我正在编写一个需要调用 web 应用程序的 C# 应用程序。我正在尝试使用System.Uri组合两个 URL:一个基本 URL 和我需要的 webapp 的特定服务(或许多)的相对路径。我有一个名为webappBackendURL我想在一个地方定义的类成员,所有调用都是从它构建的(webappBackendURL没有像我的示例说明的那样接近定义)。

System.Uri webappBackendURL = new System.Uri("http://example.com/");
System.Uri rpcURL           = new System.Uri(webappBackendURL,"rpc/import");
// Result: http://example.com/rpc/import

但是,如果webappBackendURL包含查询字符串,则它不会被保留。

System.Uri webappBackendURL = new System.Uri("http://example.com/?authtoken=0x0x0");
System.Uri rpcURL           = new System.Uri(webappBackendURL,"rpc/import");
// Result: http://example.com/rpc/import <-- (query string lost)

有没有更好的方法结合 URL?.NET 库非常广泛,所以我想我可能只是忽略了一种处理此问题的内置方法。理想情况下,我希望能够像这样组合 URL:

System.Uri webappBackendURL = new System.Uri("http://example.com/?authtoken=0x0x0");
System.Uri rpcURL           = new System.Uri(webappBackendURL,"rpc/import?method=overwrite&runhooks=true");
// Result: http://example.com/rpc/import?authtoken=0x0x0&method=overwrite&runhooks=true
4

5 回答 5

2

你可以这样做:

System.Uri webappBackendURL = 
  new System.Uri("http://example.com/?authtoken=0x0x0");
System.Uri rpcURL = new System.Uri(webappBackendURL,
  "rpc/import?ethod=overwrite&runhooks=true" 
  + webappBackendURL.Query.Replace("?", "&"));
于 2012-10-23T16:04:27.823 回答
1
System.Uri webappBackendURL = new System.Uri("http://example.com/?authtoken=0x0x0");
System.Uri rpcURL           = new System.Uri(webappBackendURL,string.Format("rpc/import?{0}method=overwrite&runhooks=true", string.IsNullOrWhiteSpace(webappBackendURL.Query) ? "":webappBackendURL.Query + "&"));

尽管我可能会创建一个采用两个 URI 并在那里进行处理的方法,以使其看起来更干净一些。

public static Uri MergerUri(Uri uri1, Uri uri2)
    {
        if (!string.IsNullOrWhiteSpace(uri1.Query))
        {
            string[] split = uri2.ToString().Split('?');

            return new Uri(uri1, split[0] + uri1.Query + "&" + split[1]);
        }
        else return new Uri(uri1, uri2.ToString());
    }
于 2012-10-23T16:14:14.793 回答
1

尝试UriTemplate

Uri baseUrl = new Uri("http://www.example.com");
UriTemplate template = new UriTemplate("/{path}/?authtoken=0x0x0");
Uri boundUri = template.BindByName(
    baseUrl,
    new NameValueCollection {{"path", "rpc/import"}});

System.UriTemplate已经在不同版本的 .NET 之间移动。您需要确定哪个程序集引用对您的项目是正确的。

于 2012-10-23T16:15:48.587 回答
1
var originalUri = new Uri("http://example.com?param1=1&param2=2");
var resultUri = new Uri(new Uri(originalUri, "/something"), originalUri.Query);

resultUri:http ://example.com/something?param1=1¶m2=2

于 2018-11-07T07:40:33.457 回答
0

使用收到的答案中的想法和片段,我编写了一个包装器方法,它完全实现了我正在寻找的东西。我希望核心 .NET 类可以处理这个问题,但看起来他们不能。

此方法将采用完整的 URL ( http://example.com?path?query=string) 并将相对 URL(字符串)以 的形式组合relative/path?query=string&with=arguemnts到其中。

private static System.Uri ExtendURL(System.Uri baseURL, string relURL)
{
    string[] parts = relURL.Split("?".ToCharArray(), 2);
    if (parts.Length < 1)
    {
        return null;
    }
    else if (parts.Length == 1)
    {
        // No query string included with the relative URL:
        return new System.Uri(baseURL,
                              parts[0] + baseURL.Query);
    }
    else
    {
        // Query string included with the relative URL:
        return new System.Uri(baseURL,
                              parts[0] + (String.IsNullOrWhiteSpace(baseURL.Query) ? "?" : baseURL.Query + "&") + parts[1]);
    }
}

ExtendURL(new System.Uri("http://example.com/?authtoken=0x0x0"),"rpc/import?method=overwrite&runhooks=true");
// Result: http://example.com/rpc/import?authtoken=0x0x0&method=overwrite&runhooks=true

感谢所有做出贡献的人!我赞成你所有的答案。

于 2012-10-23T18:42:33.557 回答