Я выполняю много запросов через набор 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 почти с каждой ссылкой (некоторые удалены из-за проблем с подпиской о конфиденциальности)