HttpClientđã được thiết kế để được sử dụng lại cho nhiều cuộc gọi . Thậm chí trên nhiều chủ đề. Các HttpClientHandlerThông tin xác thực và Cookie được dự định sẽ được sử dụng lại qua các cuộc gọi. Có một phiên bản mới HttpClientđòi hỏi phải thiết lập lại tất cả những thứ đó. Ngoài ra, DefaultRequestHeadersthuộc tính chứa các thuộc tính được dành cho nhiều cuộc gọi. Phải đặt lại các giá trị đó trên mỗi yêu cầu đánh bại điểm.
Một lợi ích lớn khác HttpClientlà khả năng thêm HttpMessageHandlersvào đường ống yêu cầu / phản hồi để áp dụng các mối quan tâm xuyên suốt. Chúng có thể được ghi nhật ký, kiểm toán, điều chỉnh, xử lý chuyển hướng, xử lý ngoại tuyến, nắm bắt các số liệu. Tất cả các loại khác nhau. Nếu một httpClient mới được tạo cho mỗi yêu cầu, thì tất cả các trình xử lý thông báo này cần được thiết lập theo từng yêu cầu và bằng cách nào đó, bất kỳ trạng thái cấp ứng dụng nào được chia sẻ giữa các yêu cầu cho các trình xử lý này cũng cần được cung cấp.
Bạn càng sử dụng các tính năng của HttpClient, bạn sẽ càng thấy rằng việc sử dụng lại một cá thể hiện có có ý nghĩa.
Tuy nhiên, vấn đề lớn nhất, theo tôi là khi một HttpClientlớp bị loại bỏ, nó sẽ xử lý HttpClientHandler, sau đó buộc phải đóng TCP/IPkết nối trong nhóm kết nối được quản lý bởi ServicePointManager. Điều này có nghĩa là mỗi yêu cầu với một HttpClientyêu cầu mới đòi hỏi phải thiết lập lại một TCP/IPkết nối mới .
Từ các thử nghiệm của tôi, sử dụng HTTP đơn giản trên mạng LAN, hiệu năng đạt được là không đáng kể. Tôi nghi ngờ điều này là do có một trình giữ TCP cơ bản đang giữ kết nối mở ngay cả khi HttpClientHandlercố gắng đóng nó.
Theo yêu cầu qua internet, tôi đã thấy một câu chuyện khác. Tôi đã thấy một hiệu suất 40% đạt được do phải mở lại yêu cầu mỗi lần.
Tôi nghi ngờ cú đánh vào một HTTPSkết nối sẽ còn tồi tệ hơn.
Lời khuyên của tôi là giữ một phiên bản của HTTPClient trong suốt thời gian ứng dụng của bạn cho từng API riêng biệt mà bạn kết nối.
Stopwatch, tuy nhiên , bạn có thể sử dụng lớp để đánh giá nó. Ước tính của tôi sẽ có ý nghĩa hơn khi có mộtHttpClient, giả sử tất cả các trường hợp đó được sử dụng trong cùng một bối cảnh.