在開發呼叫外部介面的功能時,常需根據使用者指定的 URL 以 POST 方式傳送資料。早期測試一切正常,但後續在未修改程式碼的情況下,GetResponse 卻頻繁出現超時甚至直接當機的情況。經過排查與整理,主要成因與解決辦法歸納為以下三點:
DefaultConnectionLimit系統預設的 ServicePointManager.DefaultConnectionLimit 僅為 2,若並發請求較多極易造成連線排隊導致超時。建議在程式啟動時將其調大,例如:
System.Net.ServicePointManager.DefaultConnectionLimit = 50;
長時間運行的應用程式可能累積大量未釋放的物件,影響網路連線的建立。在 HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url) 之前加入:
System.GC.Collect();
可釋放記憶體壓力,降低超時機率。
每次使用完畢務必呼叫 Close() 並將參考設為 null,確保底層連線歸還連線池:
req.Close();
req = null;
resp.Close();
resp = null;
完整程式碼範例與更深入的延遲分析可參考原文連結。