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