Wie in anderen Antworten festgestellt, sind entweder neue Uri()
ou TryCreate()
die Zecke machen kann. Die Basis-Uri muss jedoch enden mit /
und der Verwandte muss NICHT mit /
; andernfalls wird der hintere Teil der Basis-Url entfernt
Ich denke, dass dies am besten als Erweiterungsmethode durchgeführt wird, d.h.
public static Uri Append(this Uri uri, string relativePath)
{
var baseUri = uri.AbsoluteUri.EndsWith('/') ? uri : new Uri(uri.AbsoluteUri + '/');
var relative = relativePath.StartsWith('/') ? relativePath.Substring(1) : relativePath;
return new Uri(baseUri, relative);
}
und sie zu nutzen:
var baseUri = new Uri("http://test.com/test/");
var combinedUri = baseUri.Append("/Do/Something");
In Bezug auf die Leistung, verbraucht dies mehr Ressourcen als es braucht, weil der Uri-Klasse, die eine Menge von Parsing und Validierung tut; eine sehr grobe Profiling (Debug) hat eine Million Operationen in etwa 2 Sekunden. Dies wird für die meisten Szenarien zu arbeiten, jedoch effizienter zu sein, ist es besser, alles als Strings zu manipulieren, dauert dies 125 Millisekunden für 1 Million Operationen. D.h..
public static string Append(this Uri uri, string relativePath)
{
//avoid the use of Uri as it's not needed, and adds a bit of overhead.
var absoluteUri = uri.AbsoluteUri; //a calculated property, better cache it
var baseUri = absoluteUri.EndsWith('/') ? absoluteUri : absoluteUri + '/';
var relative = relativePath.StartsWith('/') ? relativePath.Substring(1) : relativePath;
return baseUri + relative;
}
Und wenn Sie trotzdem einen URI zurückgeben wollen, dauert es etwa 600 Millisekunden für 1 Million Operationen.
public static Uri AppendUri(this Uri uri, string relativePath)
{
//avoid the use of Uri as it's not needed, and adds a bit of overhead.
var absoluteUri = uri.AbsoluteUri; //a calculated property, better cache it
var baseUri = absoluteUri.EndsWith('/') ? absoluteUri : absoluteUri + '/';
var relative = relativePath.StartsWith('/') ? relativePath.Substring(1) : relativePath;
return new Uri(baseUri + relative);
}
Ich hoffe, das hilft.