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 HttpClientHandler
Thô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, DefaultRequestHeaders
thuộ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 HttpClient
là khả năng thêm HttpMessageHandlers
và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 HttpClient
lớp bị loại bỏ, nó sẽ xử lý HttpClientHandler
, sau đó buộc phải đóng TCP/IP
kế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 HttpClient
yêu cầu mới đòi hỏi phải thiết lập lại một TCP/IP
kế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 HttpClientHandler
cố 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 HTTPS
kế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.