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