我正在處理的程序中有很多與互聯網連接有關的問題,而且似乎都是從代理設置的問題中產生的。現在大多數問題都是固定的,但我現在遇到的問題是我測試代理設置的方法會讓一些用戶等待很長時間。什麼是測試代理設置的首選或可接受的方法?
這裏是我做的:
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");
}
對不起,很長的職位。我想用測試這種新方法後發現的信息來更新這個問題。
謝謝, 邁克
我使用這種單獨的線程方法結束了,它的工作原理,但它似乎是這樣一個kludge修復。一旦我有時間和機會,我會嘗試另一種看起來好多了的方法。謝謝。 – 2010-04-12 15:54:31