Üzerinde çalıştığım programda internet bağlantısı ile ilgili birçok sorun yaşıyorum ve bunların hepsi proxy ayarlarıyla bazı sorunlardan kaynaklanıyor gibi görünüyor. Bu noktada sorunların çoğu düzeltildi, ancak şu anda sahip olduğum sorun, proxy ayarlarını test etme yöntemimin bazı kullanıcıların uzun süre beklemesini sağlamasıdır.Proxy ayarlarını sınamak için tercih edilen veya kabul edilen yöntem nedir?
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
}
Bu benim proxy ayarlarının doğru olup olmadığını test etmek için bulduk tek yoludur: Burada
benim yaptığım. Web servisimize web servis çağrısı yapmayı denedim, ancak çağrı yaparken proxy ayarlarına gerek duyulmadı. Sahte proxy ayarlarım olsa bile çalışacaktır. Ancak yukarıdaki yöntemin, zaman aşımı üyesi bulunamadığını ve DownloadDataAsync'in aksine DownloadData'yı kullanabileceğimi ayarlayabileceğim bir zaman aşımı üyesi yok çünkü devam etmeden önce ayarların doğru olup olmadığını anlayabilmek için yöntemin yapılmasını beklemem gerekiyor. programda.
Daha iyi bir yöntemle ilgili öneriler veya bu yöntemle ilgili çalışmalarınız için teşekkür ederiz.
Mike
DÜZENLEME: Başka bir şey, ama hiçbir şans çalıştı. Verileri, bittiğinde WebClient'in DownloadDataCompleted olayını yükselten ayrı bir iş parçacığında karşıdan yüklemek için DownloadDataAsync yöntemini kullandım. Olayı çağırmak için beklerken bir döngü var: while (DateTime.Now < downloadStart.AddMinutes (zaman aşımı) & &! TestIsDone) {} DownloadDataCompleted olayı, olay çağrıldığında TestIsDone üyesini true olarak ayarlar. Buradaki sorun, proxy ayarlarının kötü olması durumunda Olay hiç çağrılmadığı, istisna atılmadığı ve programın devam etmeden önce tüm zaman aşımı süresi boyunca bekleyeceği sorundur. İşte bu yaklaşımın kodu:
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");
}
Uzun gönderi için özür dilerim. Bu soruyu, bu yeni yaklaşımı test ettikten sonra bulduğum bilgilerle güncellemek istedim.
sayesinde Mike
Bu ayrı iş parçacığı yöntemini kullanarak sarılıyorum ve işe yarıyor, ancak böyle bir kludge düzeltmesi gibi görünüyor. Zaman ve fırsat elde ettiğimde, daha iyi görünen diğer yöntemi deneyeceğim. Teşekkürler. –