Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebRequest&x27;s GetResponseAsync不稳定,而GetResponse不';T_C#_.net_Http Headers_Webrequest - Fatal编程技术网

C# WebRequest&x27;s GetResponseAsync不稳定,而GetResponse不';T

C# WebRequest&x27;s GetResponseAsync不稳定,而GetResponse不';T,c#,.net,http-headers,webrequest,C#,.net,Http Headers,Webrequest,我通过一组URL执行许多请求,以便检查哪些URL可以检索PDF文件 为了做到这一点,我使用HEAD方法创建了一个WebRequest,然后检查得到的响应 当我执行webRequest.GetResponse()(同步)时,一切似乎都正常,每个请求都被“触发” 另一方面,当我第三次执行wait webRequest.GetResponseAsync()时,它根本没有到达方法的末尾 由于它实际上进入了一个try-catch,以便处理可能无法访问的主机,因此它只是忽略了该链接 Async版本: pri

我通过一组URL执行许多请求,以便检查哪些URL可以检索PDF文件

为了做到这一点,我使用
HEAD
方法创建了一个
WebRequest
,然后检查得到的响应

当我执行
webRequest.GetResponse()
(同步)时,一切似乎都正常,每个请求都被“触发”

另一方面,当我第三次执行
wait 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;
}
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;
}
有人能帮我把这里的灯熄灭吗

实际上,我没有收到任何
异常
,调试器甚至没有到达
返回可下载链接

注意,这将在服务器上运行,因此我特别感兴趣的是多线程友好

EDIT:此方法不是唯一的
async
方法,我正在从其他
异步方法调用它,因此我应该正确处理
任务本身

这就是我调用
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;
}
protectedoverride异步任务ExtractPdfAsync(EmailMessageItem消息,DocumentInfo)
{
var document=新的HtmlDocument();
document.LoadHtml(message.Body.HtmlBody);
var validLinks=wait new LinkHelper(document.getvalidlinksinhtmlbodysync();
var pdfFiles=等待下载pdffromlinksasync(documentInfo,validLinks);
返回pdfFiles;
}

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

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

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

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

返回可下载链接上设置断点。跑过去。
downloadableLinks.Count
的值是多少?您是否遇到异常?为什么您的方法返回任务?您是否考虑改用
HttpClient
?尝试嗅探HTTP通信量,并查看差异。并添加更通用的日志捕获。有两个可能的原因导致我们无法返回-1如果任务已启动但未等待,则在
responseTest.Headers
或调用代码中引发了一些异常。。。