Path.Combine для URL? - PullRequest
       142

Path.Combine для URL?

1134 голосов
/ 17 декабря 2008

Path.Combine удобен, но есть ли аналогичная функция в .NET Framework для URLs ?

Я ищу следующий синтаксис:

Url.Combine("http://MyUrl.com/", "/Images/Image.jpg")

, который вернется:

"http://MyUrl.com/Images/Image.jpg"

Ответы [ 33 ]

1 голос
/ 10 декабря 2012

Используйте это:

public static class WebPath
{
    public static string Combine(params string[] args)
    {
        var prefixAdjusted = args.Select(x => x.StartsWith("/") && !x.StartsWith("http") ? x.Substring(1) : x);
        return string.Join("/", prefixAdjusted);
    }
}
1 голос
/ 25 марта 2019

Для чего это стоит, вот пара методов расширения. Первый объединяет пути, а второй добавляет параметры в URL.

    public static string CombineUrl(this string root, string path, params string[] paths)
    {
        if (string.IsNullOrWhiteSpace(path))
        {
            return root;
        }

        Uri baseUri = new Uri(root);
        Uri combinedPaths = new Uri(baseUri, path);

        foreach (string extendedPath in paths)
        {
           combinedPaths = new Uri(combinedPaths, extendedPath);
        }

        return combinedPaths.AbsoluteUri;
    }

    public static string AddUrlParams(this string url, Dictionary<string, string> parameters)
    {
        if (parameters == null || !parameters.Keys.Any())
        {
            return url;
        }

        var tempUrl = new StringBuilder($"{url}?");
        int count = 0;

        foreach (KeyValuePair<string, string> parameter in parameters)
        {
            if (count > 0)
            {
                tempUrl.Append("&");
            }

            tempUrl.Append($"{WebUtility.UrlEncode(parameter.Key)}={WebUtility.UrlEncode(parameter.Value)}");
            count++;
        }

        return tempUrl.ToString();
    }
1 голос
/ 30 сентября 2018

Я обнаружил, что конструктор Uri переворачивает '\' в '/'. Таким образом, вы также можете использовать Path.Combine с конструктором Uri.

 Uri baseUri = new Uri("http://MyUrl.com");
 string path = Path.Combine("Images", "Image.jpg");
 Uri myUri = new Uri(baseUri, path);
1 голос
/ 03 августа 2013

Вот мой подход, и я буду использовать его и для себя:

public static string UrlCombine(string part1, string part2)
{
    string newPart1 = string.Empty;
    string newPart2 = string.Empty;
    string seperator = "/";

    // If either part1 or part 2 is empty,
    // we don't need to combine with seperator
    if (string.IsNullOrEmpty(part1) || string.IsNullOrEmpty(part2))
    {
        seperator = string.Empty;
    }

    // If part1 is not empty,
    // remove '/' at last
    if (!string.IsNullOrEmpty(part1))
    {
        newPart1 = part1.TrimEnd('/');
    }

    // If part2 is not empty,
    // remove '/' at first
    if (!string.IsNullOrEmpty(part2))
    {
        newPart2 = part2.TrimStart('/');
    }

    // Now finally combine
    return string.Format("{0}{1}{2}", newPart1, seperator, newPart2);
}
1 голос
/ 17 ноября 2017

Почему бы просто не использовать следующее.

System.IO.Path.Combine(rootUrl, subPath).Replace(@"\", "/")
0 голосов
/ 01 июля 2010

Я должен отметить, что Path.Combine, кажется, работает для этого также напрямую, по крайней мере, в .NET 4.

0 голосов
/ 22 марта 2018

Мы используем следующий простой вспомогательный метод для объединения произвольного количества частей URL:

public static string JoinUrlParts(params string[] urlParts)
{
    return string.Join("/", urlParts.Where(up => !string.IsNullOrEmpty(up)).ToList().Select(up => up.Trim('/')).ToArray());
}

Обратите внимание, что он не поддерживает относительные URL-адреса '../../something/page.htm'- style!

0 голосов
/ 06 ноября 2017

Простой вкладыш:

public static string Combine(this string uri1, string uri2) => $"{uri1.TrimEnd('/')}/{uri2.TrimStart('/')}";

Вдохновленный ответом @Matt Sharpe.

0 голосов
/ 24 апреля 2017

Обе эти работы:

  Uri final = new Uri(Regex.Replace(baseUrl + "/" + relativePath, "(?<!http:)/{2,}", "/"));

Или

  Uri final =new Uri(string.Format("{0}/{1}", baseUrl.ToString().TrimEnd('/'), relativePath.ToString().TrimStart('/')));

т.е. если

baseUrl = "http://tesrurl.test.com/Int18"

и

relativePath = "To_Folder"

output = http://tesrurl.test.com/Int18/To_Folder

Некоторые ошибки появятся для кода ниже:

 // If you use the below code, some issues will be there in the final URI
 Uri final = new Uri(baseUrl, relativePath);
0 голосов
/ 28 февраля 2013

Я еще не использовал следующий код, но нашел его во время моих интернет-путешествий, чтобы решить проблему объединения URL-адресов - надеясь, что это краткий (и успешный!) Ответ:

VirtualPathUtility.Combine
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...