.Net Core HttpClientFactory cho nhiều dịch vụ API
Tôi có một dự án .Net Core cần kết nối với khoảng 4 dịch vụ API khác nhau, tôi không có chuyên gia về bất kỳ mã HttpClient nào, nhưng từ những gì tôi tìm thấy, bạn thường chỉ muốn sử dụng lại một phiên bản của HttpClient của bạn. Từ những gì tôi có thể nói với sự đồng thuận chung là sử dụng HttpClientFactory trong .Net Core bằng cách đăng ký nó trong lớp Khởi động của bạn và sau đó yêu cầu nó bằng DI.
Bây giờ hầu hết các tiêu đề mặc định của tôi và những tiêu đề đó nói chung đều giống nhau ngoài url BaseAddress, tôi nên làm như thế nào khi kết nối với 4 dịch vụ API khác nhau? Tôi có nên đăng ký 4 máy khách được đặt tên khác nhau hay có một máy khách với tất cả thông tin mặc định được thiết lập sẵn và sau đó định cấu hình thủ công khi cần, ví dụ như định cấu hình địa chỉ?
Các câu hỏi chung sẽ là vì tôi khá mới với điều này, nó được cho là sử dụng lại một phiên bản của HttpClient.
- Nếu tôi tạo 4 ứng dụng khách được đặt tên khác nhau cho mỗi dịch vụ API, điều này có tạo ra 4 phiên bản của HttpClient khi tôi gọi phương thức .CreateClient () không?
- .CreateClient () tạo một phiên bản mới mỗi khi nó được gọi, điều này không đánh bại mục đích có một phiên bản của HttpClient nếu tôi cần thực hiện 3 cuộc gọi khác nhau đến một dịch vụ API, mỗi lệnh gọi đó sẽ gọi a. CreateClient () để thiết lập một số loại kết nối và điều đó sẽ tạo ra 3 phiên bản của HttpClient?
Mọi sự giúp đỡ về sự rõ ràng sẽ được đánh giá cao,
Cảm ơn!
Trả lời
Mục đích của việc sử dụng IHttpClientFactorykhông phải để sử dụng lại các phiên bản của HttpClient. Thay vào đó, nó là sử dụng lại (bằng cách gộp chung) các thể hiện của HttpMessageHandler(thực sự HttpClientHandler, có nguồn gốc từ trừu tượng HttpMessageHandler) là đối tượng cơ bản quản lý các kết nối và ổ cắm HTTP. Sơ đồ này từ Microsoft Docs cho thấy điều đó tốt.
Bạn đã lo lắng rằng các cuộc gọi đến thường xuyên IHttpClientFactory.CreateClient()sẽ tạo ra vấn đề tương tự như các cuộc gọi thường xuyên đến new HttpClient(). Tuy nhiên, đây không phải là trường hợp. Như được giải thích bởi tài liệu của Microsoft , lý do mà các cuộc gọi thường xuyên đến new HttpClient()sẽ dẫn đến cạn kiệt socket là hàm tạo này sẽ tạo một phiên bản mới của HttpMessageHandler:
Tuy nhiên, vấn đề không thực sự xảy ra với HttpClient mà là với phương thức khởi tạo mặc định cho HttpClient, vì nó tạo ra một phiên bản cụ thể mới của HttpMessageHandler, một phiên bản có các vấn đề cạn kiệt ổ cắm và thay đổi DNS được đề cập ở trên.
Bạn có thể thấy từ mã nguồn của IHttpClientFactorynó rằng nó không sử dụng hàm tạo không tham số của HttpClientin CreateClient(). Thay vào đó, nó lấy HttpMessageHandlertừ một nhóm và đưa nó vào nhóm đã tạo HttpClient.
Cho dù bạn đang sử dụng các ứng dụng khách đã nhập hoặc đã đặt tên, bạn nên sử dụng cá thể HttpClient như thể đó là một đối tượng tạm thời: tạo ra rất rẻ và bạn không cần phải lưu trữ nó trong thời gian dài.