public static Uri Combine(this Uri uri, Uri baseUri)
{
if (uri == null)
{
throw new ArgumentNullException("uri");
}
if (baseUri == null)
{
throw new ArgumentNullException("baseUri");
}
if (baseUri.IsAbsoluteUri)
{
Uri relativeUri = uri;
if (relativeUri.ToString().StartsWith("/"))
{
if (!baseUri.ToString().EndsWith("/"))
{
baseUri = new Uri(baseUri.ToString() + "/");
}
relativeUri = new Uri(relativeUri.ToString().Substring(1), UriKind.Relative);
}
return new Uri(baseUri, relativeUri);
}
string uriString = uri.ToString();
if (uriString == "/")
{
return baseUri;
}
string baseUriString = VirtualPathUtility.AppendTrailingSlash(baseUri.ToString());
string result = VirtualPathUtility.Combine(
(baseUriString[0] == '/' ? String.Empty : "/") + baseUriString,
(uriString[0] == '/' ? uriString.Substring(1) : uriString));
return new Uri(result, UriKind.Relative);
}