логика asp.net для фиксации относительных и полных URL - PullRequest
0 голосов
/ 17 ноября 2010

У меня есть функция, которая извлекает URL-адреса из различных веб-ресурсов.Излишне говорить, что некоторые из них являются полными действительными URL-адресами, а некоторые относительны в соответствии с HTML-кодом страницы.ниже приведена моя логика asp.net/c #, которую я извлек для изучения URL-адреса, а затем сгенерировал полностью пригодный для использования URL-адрес из того, что извлечено с сайта ...

Я некоторое время не просматривал этот код, нопомните, что он работал хорошо несколько месяцев назад, и теперь ему нужно было много настроек, особенно с относительными путями и регенерацией ПОЛНОГО URL из различных относительных вариаций.

существует ли более простой способ или метод для выполнения этой, казалось бы, стандартной задачи маршрутизации, чем у меня здесь?

ПРИМЕЧАНИЕ: origianlurl - это полный URL первой поисковой страницы, аlativeUrl - это URLнаходится на странице поиска (это может быть полный сайт www.site.com или /contactus.html)

    private string ResolveRelativePaths(string relativeUrl, string originatingUrl)
    {
        if (relativeUrl.StartsWith("http") || relativeUrl.StartsWith("www"))
            return relativeUrl;

        if (relativeUrl.StartsWith("/"))
        {
            //get main url something.com
            Uri myURI = new Uri(originatingUrl);

            //add the relative page to the end
            return myURI.Host + relativeUrl;
        }

        string resolvedUrl = String.Empty;

        string[] relativeUrlArray = relativeUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
        string[] originatingUrlElements = originatingUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
        int indexOfFirstNonRelativePathElement = 0;
        for (int i = 0; i <= relativeUrlArray.Length - 1; i++)
        {
            if (relativeUrlArray[i] != "..")
            {
                indexOfFirstNonRelativePathElement = i;
                break;
            }
        }

        int countOfOriginatingUrlElementsToUse = originatingUrlElements.Length - indexOfFirstNonRelativePathElement - 1;
        //for (int i = 0; i <= countOfOriginatingUrlElementsToUse - 1; i++)
        for (int i = 0; i <= countOfOriginatingUrlElementsToUse ; i++)
        {
            if (originatingUrlElements[i] == "http:" || originatingUrlElements[i] == "https:")
                resolvedUrl += originatingUrlElements[i] + "//";
            else
                resolvedUrl += originatingUrlElements[i] + "/";
        }

        for (int i = 0; i <= relativeUrlArray.Length - 1; i++)
        {
            if (i >= indexOfFirstNonRelativePathElement)
            {
                resolvedUrl += relativeUrlArray[i];

                if (i < relativeUrlArray.Length - 1)
                    resolvedUrl += "/";
            }
        }

        return resolvedUrl;
    } 

1 Ответ

1 голос
/ 17 ноября 2010

Класс Uri имеет конструктор , который вы можете использовать именно для этого. Учитывая базовый URI, который является вашим originatingUrl и строку (относительная часть), он генерирует полный URL-адрес. Насколько я вижу, в вашем методе нет ни одной вещи, которую нельзя было бы сделать с помощью класса Uri (может быть, несколько раз) Я думаю, что вы могли бы переписать его на 5-10 LOC.

...