HttpWebRequest request = null; Stream webStream = null; HttpWebResponse response = null; StreamReader reader = null; string responseString = ""; try { byte[] bf = Encoding.UTF8.GetBytes(postString); request = WebRequest.Create(url) as HttpWebRequest; request.Method = "POST"; request.ServicePoint.Expect100Continue = false; request.Timeout = 1000 * 3; request.ContentType = "application/x-www-form-urlencoded"; request.KeepAlive = false; request.ProtocolVersion = HttpVersion.Version11; request.ContentLength = bf.Length; webStream = request.GetRequestStream(); webStream.Write(bf, 0, bf.Length); response = (HttpWebResponse)request.GetResponse(); reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseString = reader.ReadToEnd(); Log.Info(responseString); } catch (Exception ex) { throw ex; } finally { request.Abort(); request = null; if (webStream != null) { webStream.Close(); } if (reader != null) { reader.Close(); } if (response != null) { response.Close(); response = null; } } //解析 JavaScriptSerializer jsonConvert = new JavaScriptSerializer(); dynamic responseObj = jsonConvert.DeserializeObject(responseString); if (responseObj is Dictionary<string, object>) { Dictionary<string, object> jsonobj = (Dictionary<string, object>)responseObj; message.ResponseMessage = string.Format("[{0}]"+jsonobj["ResultDesc"].ToString(),DateTime.Now.ToString()); }
在調試短信通訊接口的時候出現 「基礎鏈接已經關閉: 接收時發生錯誤」html
研究很長時間 ,沒找到緣由,查找網上解決方案,其中一位仁兄的方案提供了幫助,這裏友情鏈接一下:http://blog.csdn.net/liehuo123/article/details/7071636web
總結一下緣由,多是必須指定雙方http協議相同。json
網上還有其餘的解決方案,如服務器
MyRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";網絡
這個沒試過。app
諸君若是以上方式不能解決,請請教百度君。ide
補充 :函數
http://www.cnblogs.com/1971ruru/archive/2012/04/11/2442589.htmlpost
http://www.cnblogs.com/1971ruru/archive/2012/04/11/2442593.htmlurl
http://www.cnblogs.com/1971ruru/archive/2012/04/11/2442665.html
http://blog.sina.com.cn/s/blog_3eea4f680100s48d.html
這個總結的比較多:
http://www.crifan.com/fixed_problem_sometime_httpwebrequest_getresponse_timeout/
【總結】
此處GetResponse超過的緣由是,當前存在太多數目的alive的http鏈接(大於10個),因此再次提交一樣的http的request,再去GetResponse,就會超時死掉。
解決辦法就是,把DefaultConnectionLimit 設置爲一個比較大一點的數值,此數值保證大於你當前已經存在的alive的http鏈接數便可。
【經驗總結】
之後寫http的request代碼,若是不是必須的要keepalive的,那麼就要設置KeepAlive爲false:
req.KeepAlive = false;
以及作對應的收尾動做:
if (resp != null)
{
resp.Close();
}
if (req != null)
{
req.Abort();
}
【後記 2012-03-01】
又偶爾遇到一次,DefaultConnectionLimit已是200了,足夠大了,可是GetResponse和GetRequestStream,仍是會超時死掉的問題,具體是什麼緣由致使的還不是很清楚,可是通過折騰,參考:
HttpWebResponse’s GetResponse() hangs and timeouts
在:
req = (HttpWebRequest)WebRequest.Create(constSkydriveUrl);
setCommonHttpReqPara(ref req);
resp = (HttpWebResponse)req.GetResponse();
以前,添加一句垃圾回收:
System.GC.Collect();
而後就解決了GetResponse的超時問題,而且後面的GetRequestStream也同時能夠正常工做,不超時了。
因此,看起來像是當前系統因爲調試屢次,而且HttpWebRequest和HttpWebResponse都是沒有正常去Close的,可能會殘留一些http的連接,而後就可能影響到了後續對於http的使用,垃圾回收後,估計就把殘餘的http相關資源釋放了,而後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的值
這個是參考這裏:HttpWebRequest.GetResponse() hangs the second time it is called而記錄於此的,也許有人是此緣由,因此可供參考一下。
即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