20

I have a condition in my program where I have to combine a server (e.g. http://server1.my.corp/) that may or may not have an ending slash with a relative path (e.g. /Apps/TestOne/). According to the docs, Uri should...

Canonicalizes the path for hierarchical URIs by compacting sequences such as /./, /../, //,...

So when I do something like var url = new Uri(server + relativePath), I'd expect it to take what would otherwise be http://server1.my.corp//Apps/TestOne/ and remove the double slash (i.e // -> /), but ToString, AbsolutePath and various options still show the redundant/duplicate slash. Am I not using Uri right?

Jeff B
  • 8,572
  • 17
  • 61
  • 140

1 Answers1

28

Take a look at the constructors for the Uri class. You need to specify a base Uri and a relative path to get the canonized behavior. Try something like this:

var server = new Uri("http://server1.my.corp/");
var resource = new Uri(server, "/Apps/TestOne/");
Jeff B
  • 8,572
  • 17
  • 61
  • 140
Scott
  • 1,876
  • 17
  • 13
  • 1
    A word of caution to anyone using this constructor overload: be careful if your `server` URI contains any resource path component (e.g. "http://server1.my.corp/Apps/"). The resource path will be truncated if it is not terminated with a slash ("/"). See the Remarks section of the `Uri(Uri, string)` constructor [documentation](https://learn.microsoft.com/en-us/dotnet/api/system.uri.-ctor#system-uri-ctor(system-uri-system-string)). – Blair Allen May 16 '23 at 18:43