为了账号安全,请及时绑定邮箱和手机立即绑定

WebRequest 的 GetResponseAsync 不稳定,而 GetResponse 不是

WebRequest 的 GetResponseAsync 不稳定,而 GetResponse 不是

C#
慕姐8265434 2022-07-23 18:07:37
我正在通过一组 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 链接(由于隐私订阅问题,删除了一些链接)
查看完整描述

1 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

您没有正确处理响应对象。我能够使用调试器重现您的问题,经过几次点击后它变得不稳定并且没有点击下一行。


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


using (var response = await headRequest.GetResponseAsync())

{

    if (response.Headers["Content-Type"].Contains("application/pdf"))

    {                            

        downloadableLinks.Add(link);

    }

}


查看完整回答
反对 回复 2022-07-23
  • 1 回答
  • 0 关注
  • 276 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信