代理验证程序,表现跟预期不符

srhouyu 2013-01-19 08:59:01
主要是这几段代码:
        private int numValidationThreadsRunning = 0;

// 这个是启动所有的验证任务
private void Validate()
{
foreach (ProxyItem proxy in Instance._proxyList)
proxy.validated = false;
int count = ConfigServer.NumValidationThreads;
if (count > Instance._proxyList.Count) count = Instance._proxyList.Count;
numValidationThreadsRunning = count;
for (int i = 0; i < count; i++)
{
ProxyItem proxy = Instance._proxyList[i];
BeginValidation(proxy);
}
}

// 这个是启动验证任务中的其中一项,ProxyItem是存放代理服务器信息的一个结构
private void BeginValidation(ProxyItem proxy)
{
proxy.validated = true;
proxy.timeLastValidation = DateTime.Now;
HttpWebRequest request = HttpWebRequest.Create(ConfigServer.ValidationAddress) as HttpWebRequest;
request.KeepAlive = true;
request.ContentType = "application/x-www-form-urlencoded";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8";
request.Proxy = new WebProxy(proxy.ip + ":" + proxy.port);

RequestState state = new RequestState(request, proxy);

// 请求的异步返回
IAsyncResult result = request.BeginGetResponse(new AsyncCallback(OnRequestReturn), state);

// 超时的处理
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle,
new WaitOrTimerCallback(OnTimeout),
state,
ConfigServer.ValicationTimeout * 1000,
true
);
}

// 一个验证任务完成后,去尝试其他的任务
private void ValidateMore()
{
foreach (ProxyItem proxy in Instance._proxyList)
{
if (!proxy.validated)
{
BeginValidation(proxy);
return;
}
}
numValidationThreadsRunning--;
if (numValidationThreadsRunning == 0)
{
ListChange();
LogServer.AppendLine("验证完成");
IOServer.SaveProxyList();
}
}

// 请求返回的处理
private void OnRequestReturn(IAsyncResult result)
{
RequestState state = result.AsyncState as RequestState;
HttpWebRequest request = state.request;
ProxyItem proxy = state.proxy;
HttpWebResponse response;
try
{
// 不知道为什么有时候这里会异常?
response = (HttpWebResponse)request.EndGetResponse(result);
}
catch
{
proxy.lastState = "连接错误";
proxy.validationCount++;
proxy.failAfterLastSuccessCount++;
LogServer.AppendLine(proxy.ip+":"+proxy.port+"返回并异常");
ValidateMore();
return;
}
// 验证结果
Stream stream = response.GetResponseStream();
string html = Instance.StreamToString(stream, response.CharacterSet);
Regex re = new Regex(ConfigServer.ValidationString);
MatchCollection matches = re.Matches(html);
if (matches.Count > 0)
{
proxy.lastState = "验证成功";
proxy.validationCount++;
proxy.successCount++;
proxy.failAfterLastSuccessCount = 0;
TimeSpan span = DateTime.Now - state.start;
proxy.delay = (int)span.TotalMilliseconds;
}
else
{
proxy.lastState = "不匹配";
proxy.validationCount++;
proxy.failAfterLastSuccessCount++;
}
LogServer.AppendLine(proxy.ip + ":" + proxy.port + "正常返回");
ValidateMore();
}

// 请求超时的处理
private void OnTimeout(object state, bool timeout)
{
if (timeout)
{
RequestState reqState = (RequestState)state;
if (reqState != null)
reqState.request.Abort();
ProxyItem proxy = reqState.proxy;
proxy.lastState = "超时";
proxy.validationCount++;
proxy.failAfterLastSuccessCount++;
LogServer.AppendLine(proxy.ip + ":" + proxy.port + "超时");
ValidateMore();
}
}




主要代码是参考这里:
http://www.developerfusion.com/code/4654/asynchronous-httpwebrequest/

但是它的表现跟我的预期不符:我日志中打出"验证完成"以后,大量代理服务器验证任务还会重复返回大量多次异常或者超时或者正常返回(2~3次)。不知道为什么?我用的方法是否合适?
...全文
180 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
阳光柚子 2013-01-20
  • 打赏
  • 举报
回复
友情帮顶。 HttpWebResponse由于受服务器制约和网络限制,很可能会有异常抛出,需要主动进行处理。 多线程比较麻烦,还是要仔细处理。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧