WebRequest 的 GetResponseAsync 不稳定,而 GetResponse 则不是
WebRequest's GetResponseAsync unstable while GetResponse isn't
我通过一组 URL 执行许多请求,因此我可以检查哪些请求可以检索 PDF 文件。
为了做到这一点,我用 HEAD
方法创建了一个 WebRequest
,然后检查我得到的响应。
当我执行 webRequest.GetResponse()
(同步)时,一切似乎都正常,每个请求都在 "fired"。
另一方面,当我第三次执行 await webRequest.GetResponseAsync()
时,它根本没有到达方法的末尾。
因为它实际上是为了处理可能无法访问的主机而进入try-catch
,它只是忽略了link。
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:为了提供更多信息来执行测试,这些是在电子邮件中找到的 links,我的电子邮件是有问题的是一封来自每日在线报纸的电子邮件。我已经调试了每个调用并注意到它产生了 3 个调用,因为它被一些重定向 (3xx) 转移了。 Here is a link to 几乎每个 link 的 pastebin(由于隐私订阅问题删除了一些)
您没有正确处理响应对象。我能够用调试器重现你的问题,在几次点击后它变得不稳定并且没有点击下一行。
我认为您可以通过在获得新响应之前处理响应来解决此问题:
using (var response = await headRequest.GetResponseAsync())
{
if (response.Headers["Content-Type"].Contains("application/pdf"))
{
downloadableLinks.Add(link);
}
}
我通过一组 URL 执行许多请求,因此我可以检查哪些请求可以检索 PDF 文件。
为了做到这一点,我用 HEAD
方法创建了一个 WebRequest
,然后检查我得到的响应。
当我执行 webRequest.GetResponse()
(同步)时,一切似乎都正常,每个请求都在 "fired"。
另一方面,当我第三次执行 await webRequest.GetResponseAsync()
时,它根本没有到达方法的末尾。
因为它实际上是为了处理可能无法访问的主机而进入try-catch
,它只是忽略了link。
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:为了提供更多信息来执行测试,这些是在电子邮件中找到的 links,我的电子邮件是有问题的是一封来自每日在线报纸的电子邮件。我已经调试了每个调用并注意到它产生了 3 个调用,因为它被一些重定向 (3xx) 转移了。 Here is a link to 几乎每个 link 的 pastebin(由于隐私订阅问题删除了一些)
您没有正确处理响应对象。我能够用调试器重现你的问题,在几次点击后它变得不稳定并且没有点击下一行。
我认为您可以通过在获得新响应之前处理响应来解决此问题:
using (var response = await headRequest.GetResponseAsync())
{
if (response.Headers["Content-Type"].Contains("application/pdf"))
{
downloadableLinks.Add(link);
}
}