проверьте, является ли URL ссылкой для скачивания с помощью веб-клиента - PullRequest
2 голосов
/ 10 мая 2011

Я читаю из базы данных истории, и для каждого прочитанного 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);
        }
    }
}

Ответы [ 4 ]

2 голосов
/ 10 мая 2011

Вместо загрузки всего содержимого ссылки, я бы отправил запрос HEAD.

Метод HEAD идентичен GET за исключением того, что сервер НЕ ДОЛЖЕН возвращать тело сообщения в ответе.Метаинформация, содержащаяся в заголовках HTTP в ответ на запрос HEAD, ДОЛЖНА быть идентична информации, отправленной в ответ на запрос GET.Этот метод может использоваться для получения метаинформации о сущности, подразумеваемой запросом, без передачи самого тела сущности.Этот метод часто используется для проверки гипертекстовых ссылок на достоверность, доступность и недавние изменения.

Цитата http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

См. Эти вопросы для примеров C #

2 голосов
/ 10 мая 2011

Вы на правильном пути;вам нужно будет проверить ResponseHeaders после успешного запроса:

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

Сложнее будет определить, что представляет собой ссылка для скачивания, поскольку существует так много типов содержимого.Например, как бы вы решили, являются ли данные XML ссылкой на скачивание или нет?

1 голос
/ 10 мая 2011

Попробуйте проверить коллекции ResponseHeaders WebClient для проверки типа файла ответов.

0 голосов
/ 11 мая 2011

В случае, если у кого-то есть такая же проблема, я использовал атрибут в базе данных history place.sqlite, который очень пригодился!

Places.sqlite содержит таблицу с именем moz_historyvisits, которая содержит столбец visit_type. Согласно [1], визит_тип 7 ​​равен ссылка для скачивания . Поэтому чтение этого значения будет определять, является ли это ссылкой для скачивания без чтения заголовка ответа или даже отправки метода head.

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

...