.Net Core HttpClientFactory สำหรับบริการ API หลายตัว
ฉันมีโปรเจ็กต์. Net Core ที่ต้องเชื่อมต่อกับบริการ API ต่างๆประมาณ 4 บริการฉันไม่ใช่ผู้เชี่ยวชาญเกี่ยวกับโค้ด HttpClient ใด ๆ แต่จากสิ่งที่ฉันพบคือโดยทั่วไปคุณต้องการใช้ซ้ำเพียงอินสแตนซ์เดียว ของ HttpClient ของคุณ จากสิ่งที่ฉันสามารถบอกฉันทามติทั่วไปคือการใช้ HttpClientFactory ใน. Net Core โดยการลงทะเบียนในคลาสเริ่มต้นของคุณจากนั้นขอโดยใช้ DI
ตอนนี้ส่วนหัวเริ่มต้นส่วนใหญ่ของฉันและโดยทั่วไปแล้วจะเหมือนกันทั้งหมดนอกเหนือจาก URL BaseAddress ฉันควรทำอย่างไรเมื่อเชื่อมต่อกับบริการ 4 diff API ฉันควรลงทะเบียนไคลเอนต์ที่มีชื่อแตกต่างกัน 4 ตัวหรือมีไคลเอนต์หนึ่งรายที่มีข้อมูลดีฟอลต์ทั้งหมดที่ตั้งไว้ล่วงหน้าจากนั้นกำหนดค่าด้วยตนเองตามความจำเป็นเช่นการกำหนดค่าที่อยู่?
คำถามทั่วไปอาจเป็นเพราะฉันค่อนข้างใหม่สำหรับเรื่องนี้มีการกล่าวกันว่าจะใช้ HttpClient หนึ่งอินสแตนซ์ซ้ำ
- ถ้าฉันสร้างไคลเอนต์ที่มีชื่อแตกต่างกัน 4 ตัวสำหรับแต่ละบริการ API สิ่งนี้จะไม่สร้าง 4 อินสแตนซ์ของ HttpClient เมื่อฉันเรียกเมธอด. CreateClient () หรือไม่
- .CreateClient () สร้างอินสแตนซ์ใหม่ทุกครั้งที่มีการเรียกสิ่งนี้จะไม่ทำให้จุดประสงค์ของการมี HttpClient หนึ่งอินสแตนซ์ล้มเหลวหากบอกว่าฉันต้องทำการเรียกที่แตกต่างกัน 3 ครั้งไปยังบริการ API หนึ่งการเรียกแต่ละครั้งจะเรียก CreateClient () เพื่อสร้างการเชื่อมต่อบางประเภทและจะสร้าง 3 อินสแตนซ์ของ HttpClient?
ความช่วยเหลือใด ๆ เพื่อความชัดเจนจะได้รับการชื่นชม
ขอบคุณ!
คำตอบ
วัตถุประสงค์ของการใช้งานIHttpClientFactoryไม่ใช่การนำอินสแตนซ์ของHttpClient. แต่เป็นการใช้ซ้ำ (โดยการรวม) อินสแตนซ์ของHttpMessageHandler( HttpClientHandlerซึ่งมาจากนามธรรมHttpMessageHandler) ซึ่งเป็นวัตถุต้นแบบที่จัดการการเชื่อมต่อและซ็อกเก็ต HTTP แผนภาพนี้จาก Microsoft Docs แสดงได้ดี
คุณกำลังกังวลว่าโทรบ่อยไปจะสร้างปัญหาเช่นเดียวกับการโทรบ่อยไปIHttpClientFactory.CreateClient() new HttpClient()อย่างไรก็ตามนี่ไม่ใช่กรณี ตามที่อธิบายโดยMicrosoft docsสาเหตุที่การโทรบ่อยครั้งnew HttpClient()จะส่งผลให้ซ็อกเก็ตหมดก็คือตัวสร้างนี้จะสร้างอินสแตนซ์ใหม่ของHttpMessageHandler:
อย่างไรก็ตามปัญหาไม่ได้เกิดจาก HttpClient ต่อ se แต่มีตัวสร้างเริ่มต้นสำหรับ HttpClient เนื่องจากสร้างอินสแตนซ์ที่เป็นรูปธรรมใหม่ของ HttpMessageHandler ซึ่งเป็นปัญหาที่มีปัญหาเกี่ยวกับซ็อกเก็ตและการเปลี่ยนแปลง DNS ที่กล่าวถึงข้างต้น
คุณสามารถดูจากรหัสที่มาของIHttpClientFactoryว่ามันไม่ได้ใช้ constructor parameterless ของในHttpClient CreateClient()แต่จะได้รับจากสระว่ายน้ำและฉีดลงในที่สร้างขึ้นHttpMessageHandlerHttpClient
ไม่ว่าคุณจะใช้ไคลเอนต์ที่พิมพ์หรือตั้งชื่อคุณควรใช้อินสแตนซ์ HttpClient ราวกับว่ามันเป็นวัตถุชั่วคราว: มีราคาถูกในการสร้างและคุณไม่จำเป็นต้องแคชเป็นเวลานาน