2010-03-25 16 views
6

Ü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

cevap

2

Sen ayrı dizisindeki proxycheck çalıştırabilirsiniz. Ve iş parçacığı çok uzun sürerse, kontrolün başarısız olduğunu düşünün. istek WebExceptionStatus.Timeout olarak ayarlanmış Status özelliğiyle bir WebException atılacaktır verilen zaman aşımı süresi içinde bitmiş değilse

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

:

Yoksa WebRequest kullanabilirsiniz, bu bir zaman aşımı ayarlamak sağlar.

+1

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. –

1

Burada sözü edilen her yöntem geçerlidir. Ancak en önemlisi, sınamak istediğiniz işlem için aynı Windows kullanıcı hesabını kullanarak Proxy bağlantısını sınamaktır. Çoğu vekil her Windows kullanıcısı için belirli ayrıcalıklara sahiptir.

0

Son yayınlanan bir ileti Testing IP:Port proxies, basit bir Python betiği kullanarak vekil denetimini açıklar. Komut, proxy sunucularının kullanılabilirliğini ve doğruluğunu kontrol eder.

İlgili konular