Ich habe also einen anderen Ansatz, ähnlich wie alle, die UriBuilder verwendet haben.
Ich wollte meine BaseUrl (die einen Teil des Pfads enthalten kann - z. B. http://mybaseurl.com/dev/ ) nicht wie javajavajavajavajava aufteilen .
Das folgende Snippet zeigt den Code + Tests.
Achtung: Diese Lösung verkleinert den Host und hängt einen Port an. Wenn dies nicht erwünscht ist, kann man eine Zeichenfolgendarstellung schreiben, indem man beispielsweise die Uri
Eigenschaft von nutzt 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?
Obwohl Path.Combine
Backslashes (mindestens unter Windows) zurückgegeben werden, behandelt der UriBuilder 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 den Aufruf 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 das der beste Ansatz?
Sicherlich ist diese Lösung ziemlich selbstbeschreibend (zumindest meiner Meinung nach). Sie verlassen sich jedoch auf die undokumentierte "Funktion" der .NET-API (zumindest habe ich bei einer schnellen Google-Suche nichts gefunden). Dies kann sich mit einer zukünftigen Version ändern. Bitte behandeln Sie die Methode mit Tests.
Unter https://github.com/dotnet/corefx/blob/master/src/System.Private.Uri/tests/FunctionalTests/UriBuilderTests.cs ( Path_Get_Set
) gibt es Tests, die prüfen, ob das \
korrekt transformiert wurde.
Randnotiz: Man könnte auch UriBuilder.Uri
direkt mit der Eigenschaft arbeiten, wenn der uri für einen System.Uri
ctor verwendet wird.
Url.Combine
Methode, die genau das tut.