我正在从历史数据库中读取,并且对于每个读取的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);
}
}
}
答案 0 :(得分:2)
你走在正确的轨道上;在成功请求后,您需要检查ResponseHeaders
:
var someType = "application/zip";
if (client.ResponseHeaders["Content-Type"].Contains(someType)) {
// this was a "download link"
}
棘手的部分将是确定什么构成下载链接,因为有太多可能的内容类型。例如,您如何判断XML数据是否是下载链接?
答案 1 :(得分:2)
我会发出一个HEAD请求,而不是在链接后面加载完整的内容。
HEAD方法与GET相同,只是服务器不能在响应中返回消息体。响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同。该方法可用于获得关于请求所暗示的实体的元信息,而无需转移实体主体本身。此方法通常用于测试超文本链接的有效性,可访问性和最近的修改。
引用http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
请参阅C#示例的这些问题
答案 2 :(得分:1)
尝试检查WebClient的ResponseHeaders集合以验证响应文件类型。
答案 3 :(得分:0)
如果有人遇到同样的问题,我在历史悠久的places.sqlite数据库中使用了一个非常方便的属性!
Places.sqlite包含一个名为moz_historyvisits的表,其中包含一列visit_type。根据[1],visit_type为7是下载链接。因此,读取此值将确定它是否是下载链接而不读取响应标头或甚至发送头方法。
[1] http://www.firefoxforensics.com/research/moz_historyvisits.shtml