【问题标题】:check to see if URL is a download link using webclient c#使用 webclient c# 检查 URL 是否是下载链接
【发布时间】:2011-08-22 11:33:50
【问题描述】:

我正在从历史数据库中读取数据,对于读取的每个 URL,我都在下载它并将数据存储到一个字符串中。我希望能够确定该链接是否为下载链接,例如 .exe 或 .zip我假设我需要阅读标题来确定这一点,但我不知道如何使用 WebClient 来做到这一点。有什么建议吗?

while (sqlite_datareader.Read())
{
    noIndex = false;

    string url = (string)sqlite_datareader["url"];

    try
    {
        if (url.Contains("http") && (!url.Contains(".pdf")) && (!url.Contains(".jpg")) && (!url.Contains("https")) && !isInBlackList(url))
        {

            WebClient client = new WebClient(); 
            client.Headers.Add("user-agent", "Only a test!");


            String htmlCode = client.DownloadString(url);
        }
    }
}

【问题讨论】:

    标签: c# download webclient


    【解决方案1】:

    你在正确的轨道上;您需要在请求成功后检查ResponseHeaders

    var someType = "application/zip";
    if (client.ResponseHeaders["Content-Type"].Contains(someType)) {
        // this was a "download link"
    }
    

    棘手的部分在于确定下载链接的构成,因为可能的内容类型非常多。例如,您如何判断 XML 数据是否为下载链接?

    【讨论】:

    • 确实如此。也许有一种方法可以在下载之前检查数据的大小?但是,鉴于我没有太多时间,.exe、.zip 和 .rar 就足够了。谢谢
    • 好吧,我需要下载字符串或获取响应流..我想过滤掉 .exe 等的原因是我不需要下载它们。不幸的是,并非所有链接都在其 URL 中包含 .exe,因此我需要查看响应标头:/
    • 您可以尝试改用DownloadStringAsync()。然后,一旦您有了标题,您就可以确定如何处理内容并取消或允许下载完成。
    【解决方案2】:

    尝试检查 WebClient 的 ResponseHeaders 集合以验证响应文件类型。

    【讨论】:

      【解决方案3】:

      我不会加载链接后面的完整内容,而是发出 HEAD 请求。

      HEAD 方法与 GET 相同,只是服务器不能在响应中返回消息体。响应 HEAD 请求的 HTTP 标头中包含的元信息应该与响应 GET 请求发送的信息相同。此方法可用于获取有关请求所隐含的实体的元信息,而无需传输实体主体本身。这种方法通常用于测试超文本链接的有效性、可访问性和最近的修改。

      引用http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

      有关 C# 示例,请参阅这些问题

      【讨论】:

        【解决方案4】:

        如果有人遇到同样的问题,我在 history places.sqlite 数据库中使用了一个非常方便的属性!

        Places.sqlite 包含一个名为 moz_historyvisits 的表,其中包含一个列 visit_type。根据 [1],visit_type 为 7 是 下载链接。因此,读取该值将判断是否为下载链接,无需读取响应头,甚至发送head方法。

        [1]http://www.firefoxforensics.com/research/moz_historyvisits.shtml

        【讨论】:

          猜你喜欢
          • 2012-12-09
          • 2020-08-21
          • 1970-01-01
          • 2016-09-19
          • 1970-01-01
          • 2013-04-13
          • 1970-01-01
          • 1970-01-01
          • 2020-08-04
          相关资源
          最近更新 更多