zoukankan      html  css  js  c++  java
  • HttpWebRequest中GetResponse或者说GetRequestStream偶尔超时,或者是各种操作超时造成的假死的一些解决方案

    今天用了将近一天的时间来查找这个问题的存在,不停的百度查找原因测试原因,发现解决方案很是简单,不过最好还好哦啊都解决了,在这里纪录一下,希望可以帮到你们

     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

  • 相关阅读:
    So easy Webservice 2.WebService介绍
    So easy Webservice 1.Socket建设web服务
    eclipse 实用快捷键
    Memory Layout of C Programs
    C程序员必须知道的内存知识【英】
    闭包,懂不懂由你,反正我是懂了
    什么是闭包,我的理解
    浅析Java中的访问权限控制
    Java访问控制
    Java修饰符public,private,protected及默认的区别
  • 原文地址:https://www.cnblogs.com/fengxiaojiu/p/8317486.html
Copyright © 2011-2022 走看看