2010-03-25 70 views
6

我正在处理的程序中有很多与互联网连接有关的问题,而且似乎都是从代理设置的问题中产生的。现在大多数问题都是固定的,但我现在遇到的问题是我测试代理设置的方法会让一些用户等待很长时间。什么是测试代理设置的首选或可接受的方法?

这里是我做的:

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,因为我需要等到方法完成后才能知道设置是否正确,然后才能继续在节目中。

有关更好的方法或解决此方法的任何建议,

Mike

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

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"); 
} 

对不起,很长的职位。我想用测试这种新方法后发现的信息来更新这个问题。

谢谢, 迈克

回答

2

您可以运行在一个单独的线程proxycheck。如果线程时间过长,请考虑检查失败。

或者你可以使用WebRequest的,它可以让你设置超时:

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

如果该请求没有给定的超时与Status属性设置为WebExceptionStatus.Timeout一个WebException将被抛出内完成。

+1

我使用这种单独的线程方法结束了,它的工作原理,但它似乎是这样一个kludge修复。一旦我有时间和机会,我会尝试另一种看起来好多了的方法。谢谢。 – 2010-04-12 15:54:31

1

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

0

最近的帖子Testing IP:Port proxies解释了使用简单的Python脚本进行代理检查。该脚本检查代理服务器的可用性和正确性。

相关问题