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