• HttpWebRequest使用时发生阻塞的解决办法


    HttpWebRequest使用如下:

    第一种:使用Using 释放资源

         /// <summary>
            /// Http Get请求返回数据
            /// </summary>
            /// <param name="url">Http请求URL</param>
            /// <returns>返回Http请求的结果</returns>
            public string HttpGetMethod(string url, int timeOut = 10)
            {
                string strResult = null;
                try
                {
                    if (string.IsNullOrEmpty(url))
                    {
                        return null;
                    }
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                    request.Timeout = timeOut * 1000;
                    using (HttpWebResponse wb = (HttpWebResponse)request.GetResponse())
                    {
                        using (Stream stream = wb.GetResponseStream())
                        {
                            using (StreamReader streamReader = new StreamReader(stream, Encoding.UTF8))
                            {
                                strResult = streamReader.ReadToEnd();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw;//LoggerService.Log.Error($"Http Get请求{url}返回数据失败,原因:{ex.ToString()}");
                }
                return strResult;
            }

    第二种:使用close 释放资源

            /// <summary>
            /// Http Get请求返回数据
            /// </summary>
            /// <param name="url">Http请求URL</param>
            /// <returns>返回Http请求的结果</returns>
            public string HttpGetMethod2(string url, int timeOut = 10)
            {
                if (string.IsNullOrEmpty(url))
                {
                    return null;
                }
                HttpWebRequest request = null;
                HttpWebResponse response = null;
                Stream streamReceive = null;
                StreamReader streamReader = null;
                string strResult = null;
                try
                {
                    request = (HttpWebRequest)WebRequest.Create(url);
                    request.Timeout = timeOut * 1000;
                    ServicePointManager.DefaultConnectionLimit = 200;
                    response = (HttpWebResponse)request.GetResponse();
                    streamReceive = response.GetResponseStream();
                    streamReader = new StreamReader(streamReceive, Encoding.UTF8);
                    strResult = streamReader.ReadToEnd();
                    streamReader.Close();
                    streamReader.Dispose();
                    streamReceive.Close();
                    streamReceive.Dispose();
                    response.Close();
                    request.Abort();
                }
                catch (Exception ex)
                {
                    throw;//   LoggerService.Log.Error($"Http Get请求{url}返回数据失败,原因:{ex.ToString()}");
                }
                finally
                {
                    if (streamReader != null)
                    {
                        streamReader.Close();
                        streamReader.Dispose();
                    }
                    if (streamReceive != null)
                    {
                        streamReceive.Close();
                        streamReceive.Dispose();
                    }
                    if (response != null)
                    {
                        response.Close();
                    }
                    
                }
                return strResult;
            }

    HttpWebRequest使用的2种基本写法,各种response,streamReceive ,streamReader 资源都释放了,看似没有什问题,其实只要写个while死循环,每次都去请求,你会发现,运行不了几次就阻塞了,原因很简单就是还有个HttpWebRequest对象没有释放,其实很多时候释放了Stream和Response还远远不够,客户端的Request还是在保持着,无法及时释放占有的资源,而是需要Net的GC.Collect()系统垃圾回收器来回收,因此无法保证资源的及时释放,所以一般很容易阻塞,就会出现上次的请求在处理,导致本次请求发送不出去。HttpWebRequest及时释放就是让HttpWebRequest在不需要的时候及时释放资源,这样可以重复使用而不会阻塞。 

    在程序的finally中添加下面这句就ok了。

    if (request != null)
      {
         request.Abort();
      }
  • 相关阅读:
    php抽象类,接口,特性的比较
    服务器和客户端缓存控制
    git平时用到的仓库
    PHP版DES算法加密数据
    Linux连接Windows服务器以及文件传输方法
    php连接MySQL数据库的三种方式(mysql/mysqli/pdo)
    PHP实现网站访客来访显示访客IP&浏览器&操作系统
    ESXI的使用
    vue
    Laravel学习笔记
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/11583508.html
Copyright © 2020-2023  润新知