今天用了將近一天的時間來查找這個問題的存在,不停的百度查找原因測試原因,發現解決方案很是簡單,不過最好還好哦啊都解決了,在這裡紀錄一下,希望可以幫到你們 今天我的res 一直報操作超時,百度了很多方案,一一測試,總結來說,如果你也出現了這種錯誤,可以一次嘗試一下方案 第一種:加長request的ti ...
今天用了將近一天的時間來查找這個問題的存在,不停的百度查找原因測試原因,發現解決方案很是簡單,不過最好還好哦啊都解決了,在這裡紀錄一下,希望可以幫到你們
payload = System.Text.Encoding.UTF8.GetBytes(postDataStr); request.ContentLength = payload.Length; Stream writer = request.GetRequestStream(); writer.Write(payload, 0, payload.Length); //writer.Flush(); writer.Close(); //HttpWebResponse response = (HttpWebResponse)request.GetResponse(); HttpWebResponse res; try { System.Net.ServicePointManager.DefaultConnectionLimit = 200; res = (HttpWebResponse)request.GetResponse(); } catch (WebException ex) { res = (HttpWebResponse)ex.Response; }
今天我的res 一直報操作超時,百度了很多方案,一一測試,總結來說,如果你也出現了這種錯誤,可以一次嘗試一下方案
第一種:加長request的timeout的時間,預設是100秒(我就是測試了好多方案,才發現我的timeout的時間太短,引起的操作超時)
第二種:設置request.KeepAlive = false;原因是:預設KeepAlive的屬性是true,將此屬性設置為 true 以發送帶有 Keep-alive 值的 Connection HTTP 標頭。 應用程式使用 KeepAlive 指示持久連接的首選項。 當 KeepAlive 屬性為 true 時,應用程式與支持它們的伺服器建立持久連接。也要記住要及時關閉相對應的關閉工作
if (request != null) { request.Abort(); } if (res != null) { res.Close(); }
第三種:
System.Net.ServicePointManager.DefaultConnectionLimit = 200;
加上這句話,因為這個預設設置的是2,當http的連接超過2條時,也會報這種操作超時的錯誤
第四種:
System.GC.Collect(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postDataStr.Length; request.KeepAlive = false; request.Timeout = 6000000;
在
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
之前加上:System.GC.Collect();
原因是:系統中的http相關的資源沒有正確的釋放,導致後續的GetResponse或者說GetRequestStream超時死掉
改進之後的所有代碼:
public static bool HttpPost(string Url, string postDataStr, out string errMsg, out string returnData) { try { System.GC.Collect(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postDataStr.Length; request.KeepAlive = false; request.Timeout = 6000000; //StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.UTF8); //writer.Write(postDataStr); //writer.Flush(); byte[] payload; payload = System.Text.Encoding.UTF8.GetBytes(postDataStr); request.ContentLength = payload.Length; Stream writer = request.GetRequestStream(); writer.Write(payload, 0, payload.Length); //writer.Flush(); writer.Close(); //HttpWebResponse response = (HttpWebResponse)request.GetResponse(); HttpWebResponse res; try { System.Net.ServicePointManager.DefaultConnectionLimit = 200; res = (HttpWebResponse)request.GetResponse(); } catch (WebException ex) { res = (HttpWebResponse)ex.Response; } //StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); StreamReader reader = new StreamReader(res.GetResponseStream(), Encoding.UTF8); string retString = reader.ReadToEnd(); errMsg = ""; try { returnData = Util.base642Str(retString); } catch (Exception) { returnData = retString; //throw; } if (request != null) { request.Abort(); } if (res != null) { res.Close(); } return true; }
參考文章:https://www.cnblogs.com/wohexiaocai/p/5673193.html