HttpWebRequest中GetResponse或者說GetRequestStream偶爾超時,或者是各種操作超時造成的假死的一些解決方案...

 2023-11-19 阅读 22 评论 0

摘要:今天用了將近一天的時間來查找這個問題的存在,不停的百度查找原因測試原因,發現解決方案很是簡單,不過最好還好哦啊都解決了,在這里紀錄一下,希望可以幫到你們 payload = System.Text.Encoding.UTF8.GetBytes(postDataStr);request.C

今天用了將近一天的時間來查找這個問題的存在,不停的百度查找原因測試原因,發現解決方案很是簡單,不過最好還好哦啊都解決了,在這里紀錄一下,希望可以幫到你們

 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

轉載于:https://www.cnblogs.com/fengxiaojiu/p/8317486.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/179631.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息