2009-12-01 57 views
0

對於我正在開發的項目,我們有一個桌面程序,用於聯繫商店的在線服務器。因爲它在學校中使用,所以正確設置代理設置非常棘手。我們所做的是允許用戶指定要使用的代理細節,否則它使用IE中的代理細節。我們也嘗試繞過不正確的細節,因此代碼會嘗試用戶指定的代理,如果該代理失敗,那麼失敗,如果失敗,則使用憑證,如果失敗則返回null。更改DefaultWebProxy導致WebRequests超時

我遇到的問題是,在需要連續更改代理設置的地方(例如,如果因爲代理錯誤而導致註冊失敗,它們會更改一個小小的內容並重試,需要幾秒鐘的時間。 )我最終調用HttpRequests .GetResponse()超時,導致程序凍結很長時間。有時候,如果我在變化之間留出一兩分鐘,它就不會凍結,但不是每次都會(在10分鐘後再次嘗試,現在又超時了)。

我不能在代碼中發現任何可能導致此問題的東西 - 儘管看起來有點混亂。我不認爲這可能是服務器拒絕請求,除非它是通用的服務器行爲,因爲我已經嘗試了這種請求到我們的服務器和其他人,如google.co.uk。

我發佈了代碼,希望有人能夠發現一些錯誤的東西,或者知道更簡單的方法來做我們正在嘗試的東西。

我們運行的測試沒有任何代理,所以通常會跳過第一部分。第一次運行ApplyProxy時,它可以正常工作,並在第一個try塊中完成所有操作,第二次,它可以在第一個try塊的GetResponse中超時,然後通過代碼的其餘部分,或者它可以在那裏工作,實際登記請求超時。

代碼:

無效ApplyProxy(){

 Boolean ProxySuccess = true; 
     String WebRequestURI = @"http://www.google.co.uk"; 

     if (UseProxy) 
     { 
      try 
      { 
       String ProxyUrl = (ProxyUri.ToLower().Contains("http://")) ? 
        ProxyUri : 
        "http://" + ProxyUri; 

       WebRequest.DefaultWebProxy = new WebProxy(ProxyUrl); 
       if (!string.IsNullOrEmpty(ProxyUsername) && !string.IsNullOrEmpty(ProxyPassword)) 
        WebRequest.DefaultWebProxy.Credentials = new NetworkCredential(ProxyUsername, ProxyPassword); 
       HttpWebRequest request = HttpWebRequest.Create(WebRequestURI) as HttpWebRequest; 
       request.Method = "GET"; 
       HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
      } 
      catch 
      { 
       ProxySuccess = false; 
      } 
     } 
     if(!ProxySuccess || !UseProxy) 
     { 
      try 
      { 
       WebRequest.DefaultWebProxy = WebRequest.GetSystemWebProxy(); 
       HttpWebRequest request = HttpWebRequest.Create(WebRequestURI) as HttpWebRequest; 
       request.Method = "GET"; 
       HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
      } 
      catch (Exception e) 
      { //try with credentials 
       //make a new proxy from defaults 
       WebRequest.DefaultWebProxy = WebRequest.GetSystemWebProxy(); 
       String newProxyURI = WebRequest.DefaultWebProxy.GetProxy(new Uri(WebRequestURI)).ToString(); 
       if (newProxyURI == String.Empty) 
       { //check we actually get a result 
        WebRequest.DefaultWebProxy = null; 
        return; 
       } 
       //continue 
       WebProxy NewProxy = new WebProxy(newProxyURI); 
       NewProxy.UseDefaultCredentials = true; 
       NewProxy.Credentials = CredentialCache.DefaultCredentials; 
       WebRequest.DefaultWebProxy = NewProxy; 

       try 
       { 
        HttpWebRequest request = HttpWebRequest.Create(WebRequestURI) as HttpWebRequest; 
        request.Method = "GET"; 
        HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
       } 
       catch 
       { 
        WebRequest.DefaultWebProxy = null; 
       } 
      } 

     } 
    } 

回答

0

似乎是我的一個編程錯誤。這些請求保持開放,顯然無論是程序還是服務器都不喜歡這樣。簡單地關閉HttpWebRequests似乎消除了這個問題。

0

是它不只是需要設置的HttpWebRequest的Timeout屬性的情況下?可能是連接正在進行,但沒有服務(例如錯誤類型的代理服務器或停止服務器),在這種情況下,可能是請求在放棄之前等待超時時間 - 可能會縮短超時在這裏可以選擇。

+0

不幸的是,這些請求沒有被服務,使用註冊的例子,當應該有成功或失敗的信息時,沒有東西會回來。 – Septih 2009-12-01 10:18:33