1

ネイティブ クラスを継承し、メソッドをオーバーライドWebClientして、より長いRequest.Timeoutプロパティを持つ新しいクラスを作成しました。WebClientGetWebRequest

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クラスを使用して、多数の Web ページを並列で呼び出します。

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プロパティを確認したところ、30000 (ms) に設定されています。RequestGetWebResponseWebClient

を 1 に設定してMaxDegreeOfParallelismもエラーが発生するため、並列化が問題の原因ではない可能性があります。

Request30 秒ではなく 20 秒でタイムアウトになるのはなぜですか?

4

1 に答える 1

2

タイムアウトには 2 種類あります。クライアントのタイムアウトとサーバーのタイムアウト。おそらくこの場合、遭遇しているのはサーバーのタイムアウトです。一度確認してください。

于 2012-08-23T04:43:30.747 に答える