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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM