Path part gets overwritten when merging two URIs
I need to combine two URL's that both contain .Path information.
I would like to use Uri
to give me possibility to .TryCreate(), so I can catch malformed URL's.
The problem that I'm facing is that the base URI path seems to be开发者_开发百科 ignored when I merge the absolute and the relative URI:
Uri absoluteUri= new Uri("http://hostname/path/", UriKind.Absolute);
Uri relativeUri = new Uri("/my subsite/my page.aspx?my=query", UriKind.Relative);
Uri resultUri;
if (!Uri.TryCreate(absoluteUri, relativeUri, out resultUri))
// handle errors
Output of the above is:
http://hostname/my%20subsite/my%20page.aspx?my=query
I would like it to be:
http://hostname/path/my%20subsite/my%20page.aspx?my=query
Is there a way to combine URLs that both contain path information using the Uri
class?
Your relative URI should be relative, i.e., remove first slash (or add a period),
string relative = "/my subsite/my page.aspx?my=query";
Uri test1= new Uri(relative.Substring(1), UriKind.Relative); // without 'root'
Uri test2= new Uri("." + relative, UriKind.Relative); // with 'current'
Working example:
Uri baseUri = new Uri("http://hostname/path/");
string relative = "/my subsite/my page.aspx?my=query";
Uri test1 = new Uri(baseUri, relative); // original string
Uri test2 = new Uri(baseUri, relative.Substring(1)); // without 'root' character
Uri test3 = new Uri(baseUri, "." + relative); // with 'current' character
Console.WriteLine(test1.OriginalString); // wrong
Console.WriteLine(test2.OriginalString); // right!
Console.WriteLine(test3.OriginalString); // right!
So, you probably should deal with your relative part like this:
if (relative.StartsWith("/"))
relative = "." + relative;
It could be better to check both baseUri
and relativePath
when using Uri.TryCreate():
var baseUri = absoluteUri.EndsWith('/') ? absoluteUri : absoluteUri + '/';
var relativeUri = relativePath.StartsWith('/') ? relativePath.Substring(1) : relativePath;
Refer to https://stackoverflow.com/a/58757870/5765982
However, the base Uri has to end with
/
and the relative has to NOT begin with/
; otherwise it will remove the trailing part of the base Url
精彩评论