即使在设置了超时并且程序等待设置的持续时间之后,WebRequest.GetResponse()也会引发超时异常

时间:2019-07-09 14:29:49

标签: c# httpwebrequest system.net.webexception

我尝试从电子邮件中提取的链接中获取响应代码。我使用System.Net库来完成响应代码提取。在调试和测试我的代码时,我遇到了System.Net.WebException "The operation has timed out"异常。根据{{​​3}},我必须将超时设置为至少约15秒,因为DNS查询最多可能需要15秒或更长时间才能返回请求的值。

在我的代码中,我将超时值设置为20秒(我用60进行了测试,然后在30秒之前进行了测试),每次尝试都得到了相同的超时异常。我不得不提到,在遇到超时异常之前,我需要从“相似”网站请求响应代码。这是我从以下网站请求信息的网站顺序:

  1. this question
  2. https://www.google.com/
  3. https://www.google.com/
  4. https://www.google.de/(=>按预期引发异常)
  5. https://www.google.ded/
  6. http://www.google.de/
  7. http://www.google.de/
  8. http://www.google.de/
  9. http://www.google.de/

第7个请求并随后返回:WebException "The operation has timed out"


我认为从相同或相似的链接频繁请求状态代码会使我超时。这使我想到了最后的问题:

  

我是否必须将超时设置为特定的时间,在设定的时间范围内每个客户端的请求量是否有限,如果我使用的是指向网站上不同站点的类似链接,是否可以正常工作(下面的示例)还是有一种简单的解决方法来避免这些问题?

示例:

"foo.com/a" | "foo.com/b" | "foo.com/c" | "foo.com/a/d"


编辑:

因此,我只是尝试使用一封新电子邮件来执行我的代码,该电子邮件中包含几个不同的链接,而我没有遇到任何WebException "The operation has timed out"问题。

  

因此,我想说我会在短时间内根据对网站的请求数量来获得超时,但是我对此仍然没有确切的解释。

     

随时分享您对此事件的想法(也许还可以对正在发生的事情进行解释)


这是我用来获取响应代码的代码:

public static List<LinkRespCode> GetStatusCodes(string mail)
    {
        List<LinkRespCode> li = new List<LinkRespCode>();
        try
        {
            Link[] obtainedLinks = Link_Obtainer.GetLinksTextHtml(mail);
            string[] links = new string[obtainedLinks.Length];
            var c = 0;
            foreach (Link link in obtainedLinks)
                links[c++] = link.HrefLink;
            string startUrl = "https://pastebin.com/", newLink = string.Empty;
            Uri uri = new Uri(startUrl);
            for(int i = 0; i < links.Length; i++)
            {
                try
                {
                    if (!links[i].StartsWith("http://") && !links[i].StartsWith("https://"))
                        newLink = "http://" + links[i];
                    else
                        newLink = links[i];

                    uri = new Uri(newLink);

                    if (!uri.AbsoluteUri.Equals(startUrl) && !string.IsNullOrWhiteSpace(newLink))
                    {
                        Uri uriResult;
                        if (Uri.TryCreate(newLink, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
                        {
                            obtainedLinks[i].HrefLink = uriResult.AbsoluteUri;
                            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uriResult);
                            webRequest.AllowAutoRedirect = false;
                            webRequest.Timeout = 20000;
                            HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
                            li.Add(new LinkRespCode(obtainedLinks[i], new StatusCode((int)response.StatusCode)));

                        }
                    }
                }
                catch (UriFormatException e)
                {
                    Console.WriteLine("!!!ERROR: " + links[i] + " " + e.Message);
                }
                catch (WebException e)
                {
                    Console.WriteLine("!!!ERROR: " + links[i] + " " + e.GetType() + " " + e.Message);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        return li;
    }

0 个答案:

没有答案