用技巧] Http請求偶爾超時+總結各種超時死掉的可能和相應的解決辦法

     最近在做一個從某方獲取數據的接口,在本地調試通的過程中也算順利,可是佈置到服務器上,超時非常頻繁,一度懷疑是不是服務器網絡有問題,阿里雲的應該不至於呀,於似乎找到接口對接人員,詢問有沒有什麼特殊的設置,後來實在也找不出什麼原因,就抱着試一試的態度,度娘一下,碰到這種問題的還不少,超時超時超時如何解決,不一定全行 但是我使用過後 目前不在超時,方案如下:

對於GetResponse或GetRequestStream超時死掉的原因,可能是:

1.DefaultConnectionLimit是默認的2,而當前的Http的connection用完了,導致後續的GetResponse或GetRequestStream超時死掉

==>>
默認系統只支持同時存在2個http的connection

==>>
使用HttpWebRequest之後如果沒有close,則會佔用1個http的connection,所以如果超過2次使用
HttpWebRequest而沒有close,那麼就用完系統的http的connection,之後再去使用
HttpWebRequest,GetResponse就會死掉

解決辦法:

辦法1:

每次使用完HttpWebRequest,使用

 

1
2
req.Close();
req=null;
 


 

去關閉對應的http connection

最好對應的HttpWebResponse也要close:

 

1
2
resp.Close();
resp =null;
 


 

方法2:

修改DefaultConnectionLimit的值,改爲足夠大,比如:

 

1 System.Net.ServicePointManager.DefaultConnectionLimit =
200;
 



 

2.系統中Http相關的資源沒有正確釋放,導致後續GetResponse或GetRequestStream超時死掉

就像我此處遇到的,可能是之前調用http相關函數,沒有正確完全釋放資源,導致雖然DefaultConnectionLimit給了足夠大,但是還是
會死掉,此時在http請求代碼之前去做一次垃圾回收,則後續http的GetResponse或GetRequestStream就正常了,就不會超時
死掉了。

參考代碼如下:

 

1
2
3
4
5
System.GC.Collect();
  
req =
(HttpWebRequest)WebRequest.Create(constSkydriveUrl);
setCommonHttpReqPara(ref
req);
resp = (HttpWebResponse)req.GetResponse();
 



 

3.Http的GET請求時,不要手動設置ContentLength的值

即Http的GET請求,不要添加類似如下的代碼:

 

1
2
if(m_contentLength >
0)
    httpWebRequest.ContentLength
= m_contentLength;
 


 

不要去手動修改對應的ContentLength的值,C#的http相關庫函數,會自動幫你計算的。

注:POST方法中,的確是要手動填充數據和算出數據大小,然後手動給ContentLength賦值的。

 

4.其他可能的一些原因

(1)關於KeepAlive的問題

如果Http的請求,是設置了KeepAlive=true的話,那麼對應的http的connection會和服務器保持連接的。

所以如果上述辦法都不能解決超時的問題,可以嘗試將keepAlive設置爲false試試,看看能否解決。

(2)關於Sleep

有些人好像是通過在http請求前,加了對應的Sleep,結果解決了此問題。需要的人,也可以試試。

(3)HttpWebRequest的Timeout

一般來說,既然超時了,往往是由於錯誤使用函數或者網絡有問題導致的,所以實際上此處對於有些人去把HttpWebRequest的Timeout的值改的更大,往往都是沒用的。

只不過,萬一是由於網絡響應慢而導致超時,那麼倒是可以嘗試,將HttpWebRequest的Timeout的值改爲更大。

(其中HttpWebRequest的Timeout默認的值是100,000 milliseconds ==100
seconds)

參考代碼:

 

1 req.Timeout = 5 * 60 * 1000;// 5
minutes

 

轉載的地址http://www.sufeinet.com/thread-11652-1-1.html  多謝樓主     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章