HttpWebRequest中GetResponse或者说GetRequestStream偶尔超时,或者是各类操做超时形成的假死的一些解决方案

今天用了将近一天的时间来查找这个问题的存在,不停的百度查找缘由测试缘由,发现解决方案非常简单,不过最好还好哦啊都解决了,在这里纪录一下,但愿能够帮到大家html

 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的时间过短,引发的操做超时)app

第二种:设置request.KeepAlive = false;缘由是:默认KeepAlive的属性是true,将此属性设置为 true 以发送带有 Keep-alive 值的 Connection HTTP 标头。 应用程序使用 KeepAlive 指示持久链接的首选项。 当 KeepAlive 属性为 true 时,应用程序与支持它们的服务器创建持久链接。也要记住要及时关闭相对应的关闭工做post

if (request != null)
                {
                    request.Abort();
                }
                if (res != null)
                {
                    res.Close();
                }

 

第三种测试

System.Net.ServicePointManager.DefaultConnectionLimit = 200;

 加上这句话,由于这个默认设置的是2,当http的链接超过2条时,也会报这种操做超时的错误url

第四种spa

                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;

 在code

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);

 以前加上:System.GC.Collect();orm

缘由是:系统中的http相关的资源没有正确的释放,致使后续的GetResponse或者说GetRequestStream超时死掉htm

 

    改进以后的全部代码:

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;
            }

 

                       参考文章:http://www.javashuo.com/article/p-pjdqwgke-ez.html

相关文章
相关标签/搜索