예제 #1
0
 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();
 }
예제 #2
0
        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);
        }