GetResponseAsync WebRequest нестабильный, в то время как GetResponse не работает - PullRequest
0 голосов
/ 16 января 2019

Я выполняю много запросов через набор URL-адресов, чтобы я мог проверить, какие из них могли бы извлечь файл PDF.

Для этого я создаю метод WebRequest с HEAD и проверяю полученный ответ.

Когда я выполняю webRequest.GetResponse() (синхронизация), кажется, что все работает нормально, и каждый запрос «запускается».

С другой стороны, когда я выполняю await webRequest.GetResponseAsync() в третий раз, он просто не достигает конца метода.

Поскольку это фактически try-catch для обработки возможных недоступных хостов, он просто игнорирует эту ссылку.

Async версия:

private async Task<IEnumerable<string>> GetLinksContainsDownloadablePdfAsync(IEnumerable<string> linksInMail)
{
    var downloadableLinks = new List<string>();
    foreach (var link in linksInMail)
    {
        var headRequest = WebRequest.Create(link);
        headRequest.Method = "HEAD";
        try
        {
            var responseTest = await headRequest.GetResponseAsync();
            if (responseTest.Headers["Content-Type"].Contains("application/pdf"))
                downloadableLinks.Add(link);
        }
        catch (WebException)
        {
            //If it's not accesible, just ignore it
        }
    }
    return downloadableLinks;
}

Sync версия:

private IEnumerable<string> GetLinksContainsDownloadablePdf(IEnumerable<string> linksInMail)
{
    var downloadableLinks = new List<string>();
    foreach (var link in linksInMail)
    {
        var headRequest = WebRequest.Create(link);
        headRequest.Method = "HEAD";
        try
        {
            var responseTest = headRequest.GetResponse();
            if (responseTest.Headers["Content-Type"].Contains("application/pdf"))
                downloadableLinks.Add(link);
        }
        catch (WebException)
        {
            //If it's not accesible, just ignore it
        }
    }
    return downloadableLinks;
}

Может ли кто-нибудь помочь пролить здесь свет?

На самом деле я не получаю Exception, а отладчик даже не достигает строки return downloadableLinks.

Обратите внимание, что это будет работать на сервере, поэтому мне особенно интересно быть многопоточным.

EDIT : Этот метод не единственный, который является async, и я вызываю его из других async methods, поэтому я должен правильно обрабатывать сам Task.

Это метод, в котором я вызываю GetLinksContainsDownloadablePdfAsync метод

protected override async Task<IEnumerable<StoredFile>> ExtractPdfAsync(EmailMessageItem message, DocumentInfo documentInfo)
{
    var document = new HtmlDocument();
    document.LoadHtml(message.Body.HtmlBody);
    var validLinks = await new LinkHelper(document).GetValidLinksInHtmlBodyAsync();

    var pdfFiles = await DownloadPdfFromLinksAsync(documentInfo, validLinks);
    return pdfFiles;
}

РЕДАКТИРОВАТЬ 2 : Чтобы предоставить больше информации для выполнения тестов, это ссылки, найденные в сообщениях электронной почты, а электронная почта, с которой у меня возникают проблемы, - это электронное письмо от ежедневного Интернет-газета. Я отлаживал каждый отдельный вызов и заметил, что он производит 3 вызова, так как он перенаправляется с некоторыми перенаправлениями (3xx). Вот ссылка на pastebin почти с каждой ссылкой (некоторые удалены из-за проблем с подпиской о конфиденциальности)

1 Ответ

0 голосов
/ 22 января 2019

Вы неправильно утилизируете объект ответа. Мне удалось воспроизвести вашу проблему с помощью отладчика, и после нескольких обращений она стала нестабильной и не достигла следующей строки.

Я думаю, что вы можете решить эту проблему, выбрав ответ до получения нового:

using (var response = await headRequest.GetResponseAsync())
{
    if (response.Headers["Content-Type"].Contains("application/pdf"))
    {                            
        downloadableLinks.Add(link);
    }
}
...