我正在编写一个需要调用webapp的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)
是否有更好的方法组合网址? .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
答案 0 :(得分: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("?", "&"));
答案 1 :(得分: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());
}
答案 2 :(得分: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之间移动。您需要确定哪个装配参考对您的项目是正确的。
答案 3 :(得分:0)
使用收到的答案中的想法和作品,我写了一个包装方法,完全达到我想要的效果。我希望核心的.NET类可以处理这个问题,但看起来他们不能这样做。
此方法将使用完整的网址(http://example.com?path?query=string
),并将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
感谢所有贡献的人!我赞成你所有的答案。
答案 4 :(得分:0)
var originalUri = new Uri("http://example.com?param1=1¶m2=2");
var resultUri = new Uri(new Uri(originalUri, "/something"), originalUri.Query);