WebClient超时未得到尊重

时间:2012-08-23 04:36:19

标签: c# console-application webclient

我创建了一个新的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秒时超时?

1 个答案:

答案 0 :(得分:2)

有两种超时。客户端超时和服务器超时。在这种情况下,您遇到的可能是服务器超时。检查一次。