【发布时间】:2019-01-16 12:54:29
【问题描述】:
我正在通过一组 URL 执行许多请求,因此我可以检查哪些可以检索 PDF 文件。
为了做到这一点,我用HEAD 方法创建了一个WebRequest,然后检查我得到的响应。
当我执行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 行。
请注意,这将在服务器中运行,所以我对多线程友好特别感兴趣。
编辑:这个方法不是唯一的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)转移。 Here is a link topastebin 几乎每个链接(由于隐私订阅问题删除了一些)
【问题讨论】:
-
在
return downloadableLinks;上设置断点。跑过去。downloadableLinks.Count的值是多少? -
你遇到异常了吗??
-
为什么你的方法返回Task?
-
您是否考虑过改用
HttpClient? -
尝试嗅探 HTTP 流量,看看有什么不同。并添加更通用的日志记录。我们没有达到返回的可能原因有 2 个 - 1 somwhere 任务已启动但未等待,
responseTest.Headers或调用代码中引发了一些异常...
标签: c# .net http-headers webrequest