HttpClient的巨坑


之前做項目的時候,調用api都是使用的HttpWebRequest
最近一個項目改用HttpClient,用了之后,感覺很坑。

1.高並發情況下,造成tcp連接占用的端口無法釋放(時間為2MSL,此時tcp連接狀態為TIME_WAIT)

造成這個的原因是,代碼中HttpClient的實例,都是new了之后就dispose,用tcpview工具查看,會看到大量的TIME_WAIT狀態的連接,不能及時釋放,假設短時間內大量請求進來,那么很有可能,有大量的鏈接處於等待狀態,極端點,造成服務器全部的端口都被占用,這個時候再有連接進來,將會造成失敗!這也是之前我一直遇到的問題,壓測的時候有大量的錯誤,日志顯示是因為無法連接api。

2.網上對於上面的情況有一種說法是可以把一個HttpClient實例,做成靜態的,全部線程都是用這個實例,並且表示里面的大部分方法都是線程安全。

好吧!好像的確是可以,但是在這里我遇到的問題是,我在使用這個httpClient的時候,需要動態設置請求頭內容。使用靜態的對象,很容易就遇到一個問題:集合已修改;可能無法執行枚舉操作
這里的集合就是請求頭的集合。
這個問題可以用HttpClient的SendAsyncz這個方法,參數是HttpRequestMessage,你可以把這個請求頭設置到那上面去
HttpClient的DefaultHttpHeader,HttpContent的Headers,HttpRequestMessage的Headers,三個地方都可以設置請求頭

其實到了這個地步我已經覺得HttpClient,和我現在這個項目基本就沒啥緣分了。最后的結果是用回HttpWebRequest。


免責聲明!

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



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