2010-03-25 64 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腳本進行代理檢查。該腳本檢查代理服務器的可用性和正確性。

相關問題