ネイティブ クラスを継承し、メソッドをオーバーライド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
クラスを使用して、多数の 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) に設定されています。Request
GetWebResponse
WebClient
を 1 に設定してMaxDegreeOfParallelism
もエラーが発生するため、並列化が問題の原因ではない可能性があります。
Request
30 秒ではなく 20 秒でタイムアウトになるのはなぜですか?