tags:

views:

158

answers:

2

I need to combine two url's that both contain .Path info.

I would like to use Uri to give me possibility to .TryCreate() so i can catch malformed url's.

The problem that im 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 info using Uri class?

A: 

Maybe System.IO.Path.Combine method would work?

Fiona Holder
Nope i tried that earlier and it ignores first argument completely
Anders Rask
+3  A: 

Your relativeUri 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' char
Uri test3 = new Uri(baseUri, "." + relative);        // with 'current' char

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;
Rubens Farias
did you try this? doesnt make any difference when i do.
Anders Rask
@anders, yes, works for me; I edit my answer with a complete example; please, take a look
Rubens Farias
Ah i found what made your code work and not mine:It seems that the absolute url must also end with / to make it work!I used string absoluteUrl = "http://hostname/path";and it didn't work, but with both end slahs after "path" and no start slash before "my" it seems to work! This seems flaky so ill test a bit more, but you deserve an answer for this one :-)
Anders Rask