private void _proxyMoniter_Elapsed() { if (_currentProxy.WillExpireIn(CurrentHealthCheckInterval)) // 如果在下个检查时间片过期,则提前换新 { Output("AutoProxyManager: Moniter Check expired"); UseNewProxy(); } else { Output($"定期检查代理IP...", true); var result = CheckIfHealthy(); if (result == HealthStatus.Healthy) // 健康检查 { var dueTime = Math.Max(HealthCheckIntervalMSecondsMin, CurrentHealthCheckInterval -= HealthCheckIntervalMSecondsStepLength); Output("AutoProxyManager: Moniter Check, proxy is Healthy, next dueTime " + dueTime.ToString()); _proxyMoniter.Change(dueTime, Timeout.Infinite); } else { // TODO: 其他情况也要处理 Output($"AutoProxyManager: Moniter Check Healthy result {result}"); UseNewProxy(); } } HideOutput(); }
private HealthStatus CheckIfHealthy() { if (_currentProxy == null || _currentProxy?.WillExpireIn() == true) { return(HealthStatus.ProxyNotReady); } if (!TokenManager.IsConnectInternet()) { Output($"网络异常", true); return(HealthStatus.NetworkNotHealthy); } // 先检查代理,不行就检查是否是网络问题,如果不是则加白名单(仅加一次),加了之后再从新测一遍 Output("AutoProxyManager: CheckIfHealthy " + _currentProxy.ToString()); string[] urls = new string[3] { "http://www.baidu.com", "http://www.qq.com", "http://www.163.com" }; IWebProxy proxy = new WebProxy(_currentProxy.IP, _currentProxy.Port); foreach (var url in urls) { try { if (HttpGet(url, proxy) == HttpStatusCode.OK) { return(HealthStatus.Healthy); } } catch (WebException ex) { Output("AutoProxyManager: CheckIfHealthy get with proxy " + url + ex.Message + ex.InnerException?.Message); } } bool canNormallyHttpGet = false; foreach (var url in urls) { try { if (HttpGet(url) == HttpStatusCode.OK) { canNormallyHttpGet = true; break; } } catch (WebException ex) { Output("AutoProxyManager: CheckIfHealthy no proxy get " + url + ex.Message + ex.InnerException?.Message); canNormallyHttpGet = false; } } if (!canNormallyHttpGet) { Output($"Http服务异常", true); return(HealthStatus.HttpServiceNotHealthy); } Output($"当前代理IP {_currentProxy.ToString().ToMosaicString()}似乎不起作用", true); return(HealthStatus.ProxyNotHealthy); }