【问题标题】:asp.net logic for fixing relative urls to full urls用于将相对 url 固定为完整 url 的 asp.net 逻辑
【发布时间】:2010-11-16 22:14:50
【问题描述】:

我有一个从各种网络资源中提取 URL 的功能。不用说,有些是完全有效的 URL,有些是相对于页面 HTML 的。下面是我为检查 URL 而派生的 asp.net/ c# 逻辑,然后从站点中提取的内容生成完整可用的 URL...

我已经有一段时间没有看过这段代码了,但我记得几个月前它运行良好,现在它需要进行许多调整才能运行 - 特别是相对路径和从各种相对变化中重新生成完整 url。

有没有比我这里更简单的方法或方法来完成这个看似路由样板任务?

注意: origianlurl 是第一个搜索页面的完整 url,relativeUrl 是在搜索页面中找到的 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;
    } 

【问题讨论】:

    标签: asp.net url screen-scraping


    【解决方案1】:

    Uri 类有一个 constructor,您可以准确地使用它。给定一个基本 uri,即您的 originatingUrl 和一个字符串(相对部分),它会生成完整的 url。据我所知,您的方法中没有一件事不能使用 Uri 类(可能是一些实例)来完成。我的猜测是您可以将其重写为 5-10 LOC。

    【讨论】:

    • 我尽可能使用 uri 类,但你永远不知道你会从网上下载什么。由于变量太多,这个自定义代码似乎更适合处理所有变化。我担心 uri 类会左右抛出错误。
    • @kacalapy:你害怕它吗?您甚至没有尝试并自动假设您可以编写比框架中的功能更好的功能。 Uri 类有一个 TryCreate 方法,如果失败则返回 false。这不是左右扔错误。我 100% 确信 Uri 类比您的代码更健壮,并且可以处理更多特殊情况。
    • 我确实尝试过,这就是为什么我选择了另一种方式...我在示例顶部使用 uri calss,您能详细说明一下 TryCreate 的使用,我之前似乎没有这个.最初的代码也是 .net 2.0 现在我将它全部移植到 .net 4.0
    猜你喜欢
    • 2010-09-12
    • 2012-11-06
    • 2013-06-29
    • 1970-01-01
    • 2011-11-19
    • 2023-04-06
    • 2022-11-16
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多