Ich habe also einen anderen Ansatz, ähnlich wie alle, die UriBuilder verwendet haben.
Ich wollte meine BaseUrl nicht aufteilen (die einen Teil des Pfades enthalten kann - z. B. http://mybaseurl.com/dev/ ) als javajavajavajavajava hat.
Das folgende Snippet zeigt den Code + Tests.
Vorsicht! Bei dieser Lösung wird der Host kleingeschrieben und ein Port angehängt. Wenn dies nicht erwünscht ist, kann man eine String-Darstellung schreiben, indem man z.B. die Uri
Eigentum von UriBuilder
.
public class Tests
{
public static string CombineUrl (string baseUrl, string path)
{
var uriBuilder = new UriBuilder (baseUrl);
uriBuilder.Path = Path.Combine (uriBuilder.Path, path);
return uriBuilder.ToString();
}
[TestCase("http://MyUrl.com/", "/Images/Image.jpg", "http://myurl.com:80/Images/Image.jpg")]
[TestCase("http://MyUrl.com/basePath", "/Images/Image.jpg", "http://myurl.com:80/Images/Image.jpg")]
[TestCase("http://MyUrl.com/basePath", "Images/Image.jpg", "http://myurl.com:80/basePath/Images/Image.jpg")]
[TestCase("http://MyUrl.com/basePath/", "Images/Image.jpg", "http://myurl.com:80/basePath/Images/Image.jpg")]
public void Test1 (string baseUrl, string path, string expected)
{
var result = CombineUrl (baseUrl, path);
Assert.That (result, Is.EqualTo (expected));
}
}
Getestet mit .NET Core 2.1 unter Windows 10.
Warum funktioniert das?
Auch wenn Path.Combine
wird Backslashes zurückgeben (zumindest unter Windows), der UriBuilder behandelt diesen Fall im Setter von Path
.
Entnommen aus https://github.com/dotnet/corefx/blob/master/src/System.Private.Uri/src/System/UriBuilder.cs (Beachten Sie die Aufforderung an string.Replace
)
[AllowNull]
public string Path
{
get
{
return _path;
}
set
{
if ((value == null) || (value.Length == 0))
{
value = "/";
}
_path = Uri.InternalEscapeString(value.Replace('\\', '/'));
_changed = true;
}
}
Ist dies der beste Ansatz?
Sicherlich ist diese Lösung ziemlich selbsterklärend (zumindest meiner Meinung nach). Aber Sie verlassen sich auf undokumentierte (zumindest fand ich nichts mit einer schnellen Google-Suche) "Funktion" von der .NET-API. Dies kann sich mit einer zukünftigen Version ändern, also decken Sie bitte die Methode mit Tests ab.
Es gibt Tests in https://github.com/dotnet/corefx/blob/master/src/System.Private.Uri/tests/FunctionalTests/UriBuilderTests.cs ( Path_Get_Set
), die prüfen, ob die \
korrekt transformiert wird.
Nebenbemerkung: Man könnte auch mit dem UriBuilder.Uri
Eigenschaft direkt zu verwenden, wenn die uri für eine System.Uri
ctor.