對於我正在開發的項目,我們有一個桌面程序,用於聯繫商店的在線服務器。因爲它在學校中使用,所以正確設置代理設置非常棘手。我們所做的是允許用戶指定要使用的代理細節,否則它使用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;
}
}
}
}
不幸的是,這些請求沒有被服務,使用註冊的例子,當應該有成功或失敗的信息時,沒有東西會回來。 – Septih 2009-12-01 10:18:33