WebRequest的GetResponseAsync不稳定,而GetResponse不是

时间:2019-01-16 12:54:29

标签: c# .net http-headers webrequest

我正在通过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行。

请注意,这将在服务器中运行,因此我特别希望对多线程友好。

编辑:该方法不是唯一的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 to pastebin几乎包含所有链接(由于隐私订阅问题而删除了一些链接)

1 个答案:

答案 0 :(得分:1)

您没有正确布置响应对象。我可以使用调试器重现您的问题,但在点击几下后,它变得不稳定并且没有到达下一行。

我认为您可以通过在获得新响应之前处理响应来解决此问题:

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