我创建了一个新的WebClient
类,它具有更长的Request.Timeout
属性,方法是继承本机WebClient
类并覆盖GetWebRequest
方法:
public class LongerTimeoutWebClient : WebClient
{
public LongerTimeoutWebClient()
{
}
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest r = base.GetWebRequest(address);
r.Timeout = 30 * 1000; //30 second timeout
return r;
}
}
我使用这个新的WebClient
类来并行调用多个网页:
Parallel.ForEach(links, new ParallelOptions { MaxDegreeOfParallelism = 2 }, link =>
{
byte[] requestBytes;
var stopwatch = new System.Diagnostics.Stopwatch();
using (var client = new LongerTimeoutWebClient())
{
try
{
ServicePointManager.Expect100Continue = false;
stopwatch.Start();
requestBytes = client.DownloadData(link);
}
catch (Exception ex)
{
stopwatch.Stop();
Console.WriteLine("Could not get: " + link + ". Timeout after: " + stopwatch.Elapsed.TotalSeconds + "s");
Console.WriteLine(ex);
return;
}
}
//More code here
}
但是,我间歇性地收到408 Request Timeout
错误。发生超时错误时的秒表值大约为20秒。
我还检查了新Timeout
类的Request
方法使用的GetWebResponse
对象的WebClient
属性,并将其设置为30000(ms)。
我已将MaxDegreeOfParallelism
设置为1并且仍然会收到错误,因此这可能意味着并行化不是导致问题的原因。
为什么我的Request
会在20秒而不是30秒时超时?
答案 0 :(得分:2)
有两种超时。客户端超时和服务器超时。在这种情况下,您遇到的可能是服务器超时。检查一次。