WebRequest 的 GetResponseAsync 不稳定,而 GetResponse 不是

我正在通过一组 URL 执行许多请求,因此我可以检查哪些请求可以检索 PDF 文件。


为了做到这一点,我创建了一个WebRequestwithHEAD方法,然后检查我得到的响应。


当我执行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,我从 other 调用它async methods,所以我应该正确处理它Task本身。


编辑 2:为了提供更多信息来执行测试,这些是在电子邮件中找到的链接,而我遇到问题的电子邮件是来自每日在线报纸的电子邮件。我已经调试了每一个调用,并注意到它产生了 3 个调用,因为它被一些重定向(3xx)转移。这是几乎每个链接的 pastebin 链接(由于隐私订阅问题,删除了一些链接)


慕姐8265434
浏览 349回答 1
1回答

蛊毒传说

您没有正确处理响应对象。我能够使用调试器重现您的问题,经过几次点击后它变得不稳定并且没有点击下一行。我认为您可以通过在获得新响应之前处理响应来解决此问题:using (var response = await headRequest.GetResponseAsync()){&nbsp; &nbsp; if (response.Headers["Content-Type"].Contains("application/pdf"))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; downloadableLinks.Add(link);&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP