【发布时间】:2013-10-07 21:04:10
【问题描述】:
我有以下测试代码。循环 316934 或 361992 次后,我总是收到“任务已取消”错误。
如果我没记错的话,取消任务有两个可能的原因:a) HttpClient 超时或 b) 队列中的任务太多,某些任务超时。
我找不到有关排队任务限制的文档。我尝试创建超过 500K 的任务并且没有超时。我猜“b”的原因可能不正确。
第一季度。我错过了还有其他原因吗?
第二季度。如果是因为 HttpClient 超时,我怎样才能得到确切的异常消息而不是“TaskCancellation”异常。
第三季度。修复它的最佳方法是什么?我应该介绍节流器吗?
谢谢!
var _httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");
int[] intArray = Enumerable.Range(0, 600000).ToArray();
var results = intArray
.Select(async t => {
using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "http://www.google.com")) {
log.Info(t);
try {
var response = await _httpClient.SendAsync(requestMessage);
var responseContent = await response.Content.ReadAsStringAsync();
return responseContent;
}
catch (Exception ex) {
log.ErrorException(string.Format("SoeHtike {0}", Task.CurrentId), ex);
}
return null;
}
});
Task.WaitAll(results.ToArray());
Console.ReadLine();
这是复制问题的步骤。
在 VS 2012 中创建控制台项目。
请将我的代码复制并粘贴到 Main。
把断点放在这一行" log.ErrorException(string.Format("SoeHtike {0}", 任务.CurrentId), ex);"
在调试模式下运行程序。等待几分钟。 (也许 5 分钟?)我刚刚测试了我的代码,3 分钟后我得到了异常。如果您有提琴手,您可以监视请求,以便您知道程序是否仍在运行。
如果您无法复制该问题,请随时告诉我。
【问题讨论】:
-
你正在做的是让页面 600.000 它实际上是 DOS 攻击,你不应该这样做。
-
嗨,我明白了。但是有些网站可以处理巨大的请求。而且我真的很想知道为什么我得到“任务被取消”而没有实际的错误消息。
-
另外,我认为这不是阻止我请求的网站
-
@Pedro.The.Kid 也许他是在蛮横地强迫自己的网站建立针对 DOS 攻击的保护?
标签: c# httpclient async-await