我尝试从电子邮件中提取的链接中获取响应代码。我使用System.Net
库来完成响应代码提取。在调试和测试我的代码时,我遇到了System.Net.WebException "The operation has timed out"
异常。根据{{3}},我必须将超时设置为至少约15秒,因为DNS查询最多可能需要15秒或更长时间才能返回请求的值。
在我的代码中,我将超时值设置为20秒(我用60进行了测试,然后在30秒之前进行了测试),每次尝试都得到了相同的超时异常。我不得不提到,在遇到超时异常之前,我需要从“相似”网站请求响应代码。这是我从以下网站请求信息的网站顺序:
第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;
}