测试代理设置的首选方法是什么?

我正在处理的程序中的互联网连接有很多麻烦,而这一切似乎都是由代理设置的某些问题产生的。 此时的大多数问题都是固定的,但我现在遇到的问题是我的代理设置测试方法会让一些用户等待很长时间。

这是我做的:

System.Net.WebClient webClnt = new System.Net.WebClient(); webClnt.Proxy = proxy; webClnt.Credentials = proxy.Credentials; byte[] tempBytes; try { tempBytes = webClnt.DownloadData(url.Address); } catch { //Invalid proxy settings //Code to handle the exception goes here } 

这是我发现测试代理设置是否正确的唯一方法。 我尝试对我们的Web服务进行Web服务调用,但在拨打电话时不需要代理设置。 即使我有伪造的代理设置,它也会工作。 但是,上面的方法没有我可以设置的超时成员,我可以使用DownloadData而不是DownloadDataAsync,因为我需要等待方法完成,以便在继续之前我可以知道设置是否正确在该计划中。

任何关于更好的方法或解决方法的建议都值得赞赏。

麦克风

编辑:我尝试了其他的东西,但没有运气。 我使用DownloadDataAsync方法在一个单独的线程中下载数据,该线程在完成后引发WebClient的DownloadDataCompleted事件。 当我等待事件被调用时,我有一个循环:while(DateTime.Now <downloadStart.AddMinutes(timeout)&&!TestIsDone){}当调用事件时,DownloadDataCompleted事件将TestIsDone成员设置为true。 这里的问题是如果代理设置不好,则永远不会调用Event,不会抛出异常,程序会在继续之前等待整个超时时间。 以下是此方法的代码:

 public static bool TestProxy(System.Net.WebProxy proxy) { ProxySettingsTestDone = false; //public static var string address = //url to some arbitrary data on our server System.Net.WebClient webClnt = new System.Net.WebClient(); webClnt.Proxy = proxy; webClnt.Credentials = proxy.Credentials; try { webClnt.DownloadDataCompleted += new System.Net.DownloadDataCompletedEventHandler(DownloadDataCallback); webClnt.DownloadDataAsync(new Uri(address)); //Timeout period DateTime dnldStartTime = DateTime.Now; while (DateTime.Now < dnldStartTime.AddMinutes(1.0) && !ProxySettingsTestDone) { } if (!ProxySettingsTestDone) //Exceded timeout { throw new System.Net.WebException("Invalid Proxy Settings"); } } catch (System.Net.WebException e) { if (e.Status == System.Net.WebExceptionStatus.ProxyNameResolutionFailure) { //Proxy failed, server may or may not be there Util.ConnectivityErrorMsg = e.Message; return false; } else if (e.Status == System.Net.WebExceptionStatus.ProtocolError) { //File not found, server is down, but proxy settings succeded ServerUp = false; Util.ConnectivityErrorMsg = e.Message; return true; } return false; } Util.ConnectivityErrorMsg = ""; return true; } private static void DownloadDataCallback(object sender, System.Net.DownloadDataCompletedEventArgs e) { if (!e.Cancelled && e.Error == null) ProxySettingsTestDone = true; else throw new System.Net.WebException("Invalid Proxy Settings"); } 

抱歉这篇长篇文章。 我想用测试这种新方法后发现的信息来更新这个问题。

谢谢,迈克

您可以在单独的线程中运行proxycheck。 如果线程花费的时间太长,请考虑检查失败。

或者您可以使用WebRequest,它允许您设置超时:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://url"); request.Proxy = proxy; request.Timeout = 2000; 

如果请求未在给定超时内完成,则将抛出Status属性设置为WebExceptionStatus.Timeout

这里提到的每种方法都是有效的 但最重要的一个是使用相同的Windows用户帐户测试代理连接,以确定要测试的进程。 许多代理具有每个Windows用户的特定权限。

最近的post测试IP:端口代理使用简单的Python脚本解释代理检查。 该脚本检查代理服务器的可用性和正确性。