.NET рдореЗрдВ HttpClient рдХреЗ рдиреБрдХрд╕рд╛рди

"рдиреБрдХрд╕рд╛рди" рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдореИрдВ System.Net.HttpClient рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЬреЛ рдЕрдХреНрд╕рд░ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХрдИ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рддреБрд░рдВрдд рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд╕рдХрддреА рд╣реИрдВред

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдПрдХ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдШрдЯрдХ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдХреА рдЕрдирджреЗрдЦреА рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рдлрд▓рддрд╛рдУрдВ, рд╕реБрд░рдХреНрд╖рд╛, рдЖрджрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди, рдорд╛рдкрдиреАрдпрддрд╛, рд╡рд╕реВрд▓реА рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА HttpClient рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рдердорд┐рдХ рдШрдЯрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рд╕рд╡рд╛рд▓ рд╣реИрдВ: рдпрд╣ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдиреЗрдХреНрд╢рди рдХрд┐рддрдирд╛ рдмрдирд╛рддрд╛ рд╣реИ, рд╡реЗ рдХрд┐рддрдиреЗ рд╕рдордп рддрдХ рд░рд╣рддреЗ рд╣реИрдВ, рдпрд╣ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ рдпрджрд┐ DNS рдирд╛рдо рдЬреЛ рдкрд╣рд▓реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдИрдкреА рдкрддреЗ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ? рдЖрдЗрдП рд▓реЗрдЦ рдореЗрдВ рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред

  1. рдХрдиреЗрдХреНрд╢рди рд▓реАрдХ
  2. рд╕рдорд╡рд░реНрддреА рд╕рд░реНрд╡рд░ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ
  3. рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдФрд░ рдбреАрдПрдирдПрд╕ рдХреИрд╢рд┐рдВрдЧ

HttpClient рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рдХрдиреЗрдХреНрд╢рди рд░рд┐рд╕рд╛рд╡ рд╣реИ ред рдХрд╛рдлреА рдмрд╛рд░, рдореБрдЭреЗ рдЙрд╕ рдХреЛрдб рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬрд╣рд╛рдВ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

public async Task<string> GetSomeText(Guid textId) { using (var client = new HttpClient()) { return await client.GetStringAsync($"http://someservice.com/api/v1/some-text/{textId}"); } } 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рдмрд░реНрдмрд╛рджреА рдФрд░ рдЦреБрд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реВрдЪреА рдХреЗ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

 static void Main(string[] args) { for(int i = 0; i < 10; i++) { using (var client = new HttpClient()) { client.GetStringAsync("https://habr.com").Wait(); } } } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, netstat рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреБрд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реВрдЪреА рджреЗрдЦреЗрдВ:

 PS C: \ Development \ рд╡реНрдпрд╛рдпрд╛рдо> netstat -n |  рд╕реЗрд▓реЗрдХреНрдЯ-рд╕реНрдЯреНрд░рд┐рдВрдЧ-рд╕реНрдЯрд╛рдЯрди "178.248.237.68"

   рдЯреАрд╕реАрдкреА 192.168.1.13:43684 178.248.237.68-00-0043 TIME_WAIT
   рдЯреАрд╕реАрдкреА 192.168.1.13:43685 178.248.237.68-00-0043 TIME_WAIT
   рдЯреАрд╕реАрдкреА 192.168.1.13:43686 178.248.237.68-00-0043 TIME_WAIT
   рдЯреАрд╕реАрдкреА 192.168.1.13:43687 178.248.237.68-00-0043 TIME_WAIT
   рдЯреАрд╕реАрдкреА 192.168.1.13:43689 178.248.237.68-00-0043 TIME_WAIT
   рдЯреАрд╕реАрдкреА 192.168.1.13-00-003690 178.248.237.68-00-0043 TIME_WAITIT
   рдЯреАрд╕реАрдкреА 192.168.1.13-00-003691 178.248.237.68-00-0043 TIME_WAITIT
   рдЯреАрд╕реАрдкреА 192.168.1.13-00-003692 178.248.237.68-00-0043 TIME_WAITIT
   рдЯреАрд╕реАрдкреА 192.168.1.13-00-003693 178.248.237.68-00-0043 TIME_WAITIT
   рдЯреАрд╕реАрдкреА 192.168.1.13-00-003695 178.248.237.68-00-0043 TIME_WAITIT

рдпрд╣рд╛рдВ, рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди-рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдкреНрд░рддреНрдпреЗрдХ рдЖрдИрдкреА рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╕реНрдЯреИрдЯ рдбреЛрдореЗрди рдирд╛рдо рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛, рдФрд░ 178.248.237.68 рд▓реЗрдЦрди рдХреЗ рд╕рдордп habr.com рдЖрдИрдкреА рдкрддреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдЦреЗрдЧрд╛ред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдФрд░ рднрд▓реЗ рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реЛ, рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди "рд▓рдЯрдХрд╛ рд╣реБрдЖ" рд░рд╣рд╛ред рдФрд░ рд╡реЗ рддрдм рддрдХ рд▓рдЯрдХрд╛рдПрдВрдЧреЗ рдЬрдм рддрдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреБрдВрдЬреА рдореЗрдВ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ TcpTimedWaitDelayред

рдПрдХ рд╕рд╡рд╛рд▓ рддреБрд░рдВрдд рдЙрда рд╕рдХрддрд╛ рд╣реИ - рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ .NET рдХреЛрд░ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ? рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдХреНрдпрд╛ рд╣реИ, рд▓рд┐рдирдХреНрд╕ рдкрд░ рдХреНрдпрд╛ рд╣реИ - рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрдиреЗрдХреНрд╢рди рд░рд┐рдЯреЗрдВрд╢рди рд╕рд┐рд╕реНрдЯрдо рд▓реЗрд╡рд▓ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рди рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЗрд╡рд▓ рдкрд░ред TIME_WAIT рд╕реНрдерд┐рддрд┐ рд╕реЙрдХреЗрдЯ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд┐рддрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рдмрдВрдж рд╣реИ, рдФрд░ рдпрд╣ рдЙрди рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдЕрднреА рднреА рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рдЕрд╡рдзрд┐ / proc / sys / net / ipv4 / tcp_fin_timeout рдореЗрдВ рд╕реЗрдХрдВрдб рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

HttpClient рдХрд╛ рджреВрд╕рд░рд╛ рдореБрджреНрджрд╛ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдорд╡рд░реНрддреА рдХрдиреЗрдХреНрд╢рди рдХреА рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╕реАрдорд╛ рд╣реИ ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдкрд░рд┐рдЪрд┐рдд .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ рдЖрдк рдЕрддреНрдпрдзрд┐рдХ рднрд░реА рд╣реБрдИ рд╕реЗрд╡рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдЖрддреЗ рд╣реИрдВред рдХрдиреЗрдХреНрд╢рди рд░рд┐рд╕рд╛рд╡ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА HttpClient рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдХрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 static void Main(string[] args) { var client = new HttpClient(); var tasks = new List<Task>(); for (var i = 0; i < 10; i++) { tasks.Add(SendRequest(client, "http://slowwly.robertomurray.co.uk/delay/5000/url/https://habr.com")); } Task.WaitAll(tasks.ToArray()); } private static async Task SendRequest(HttpClient client, string url) { var response = await client.GetAsync(url); Console.WriteLine($"Received response {response.StatusCode} from {url}"); } 

рд▓рд┐рдВрдХ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрди рдЖрдкрдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ - 5 рд╕реЗрдХрдВрдбред

рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ - рд╣рд░ 5 рд╕реЗрдХрдВрдб рдореЗрдВ рдХреЗрд╡рд▓ 2 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рдЖрддреА рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ 10 рдПрдХ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЧрдП рдереЗред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ HTTP рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдорд┐рдд .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд, рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ System.Net.ServicePointManager рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреА рд╣реИ рдЬреЛ HTTP рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкрд╣рд▓реБрдУрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ DefaultConnectionLimit рдЧреБрдг рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рд╕рдорд╡рд░реНрддреА рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп 2 рд╣реИред

рдпрджрд┐ рдЖрдк рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ

 ServicePointManager.DefaultConnectionLimit = 5; 

рддрдм рдЙрджрд╛рд╣рд░рдг рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рддреЗрдЬреА рдЖрдПрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ 5 рдХреЗ рдмреИрдЪ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдФрд░ .NET рдХреЛрд░ рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕реЗрд╡рд╛рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдЙрди рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдбреЛрдореЗрди рдХреЗ рдмрд╛рдж рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдПрдЧреАред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде-рд╕рд╛рде, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдбреЛрдореЗрди рдирд╛рдо рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдпрд╣ ServicePoint рд╡рд░реНрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 var delayServicePoint = ServicePointManager.FindServicePoint(new Uri("http://slowwly.robertomurray.co.uk")); delayServicePoint.ConnectionLimit = 3; var habrServicePoint = ServicePointManager.FindServicePoint(new Uri("https://habr.com")); habrServicePoint.ConnectionLimit = 5; 

рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрд╕реА HttpClient рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Habr рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░реИрдХреНрд╢рди рдореЗрдВ 5 рдПрдХ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ "рдзреАрдореА" рд╕рд╛рдЗрдЯ рдХреЗ рд╕рд╛рде 3 рдХрдиреЗрдХреНрд╢рдиред

рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╣реИ - рд╕реНрдерд╛рдиреАрдп рдкрддреЗ (рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ) рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рд╕реАрдорд╛ int.MaxValue рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣реИред рдкрд╣рд▓реЗ DefaultConnectionLimit рдХреЛ рд╕реЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:

 var habrServicePoint = ServicePointManager.FindServicePoint(new Uri("https://habr.com")); Console.WriteLine(habrServicePoint.ConnectionLimit); var localServicePoint = ServicePointManager.FindServicePoint(new Uri("http://localhost")); Console.WriteLine(localServicePoint.ConnectionLimit); 

рдЕрдм .NET .NET рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ ServicePointManager рдЕрднреА рднреА System.Net рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ .NET рдХреЛрд░ рдореЗрдВ HttpClient рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, HTTP рдХрдиреЗрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ HttpClientHandler (рдпрд╛ SocketsHttpHandler, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 static void Main(string[] args) { var handler = new HttpClientHandler(); handler.MaxConnectionsPerServer = 2; var client = new HttpClient(handler); var tasks = new List<Task>(); for (int i = 0; i < 10; i++) { tasks.Add(SendRequest(client, "http://slowwly.robertomurray.co.uk/delay/5000/url/https://habr.com")); } Task.WaitAll(tasks.ToArray()); Console.ReadLine(); } private static async Task SendRequest(HttpClient client, string url) { var response = await client.GetAsync(url); Console.WriteLine($"Received response {response.StatusCode} from {url}"); } 

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ рдирд┐рдпрдорд┐рдд .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг - рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ 2 рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк MaxConnectionsPerServer рдкреНрд░реЙрдкрд░реНрдЯреА рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ .NET рдХреЛрд░ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдореВрд▓реНрдп int.MaxValue рд╣реИред

рдФрд░ рдЕрдм рдЪрд▓реЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рддреАрд╕рд░реА рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдкрд┐рдЫрд▓реЗ рджреЛ - рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдФрд░ рдбреАрдПрдирдПрд╕ рдХреИрд╢рд┐рдВрдЧ рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдбреЛрдореЗрди рдирд╛рдо рдХреЛ рдкрд╣рд▓реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрдИрдкреА рдкрддреЗ рдкрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдкрддреЗ рдХреЛ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХреИрд╢ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреНрдпрд╛рджрд╛рддрд░ рдЕрдХреНрд╕рд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реИред

рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЬрд┐рд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╣рдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕реЗ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рд╕рд░реНрд╡рд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдЕрд▓рдЧ рдЖрдИрдкреА рдкрддреЗ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреЗрдВрджреНрд░ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдкрд╣рд▓реЗ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ (рдЬреЛ рдЬрд▓реНрджреА рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рдПрдХ рд╕реНрдерд╛рдпреА рдХрдиреЗрдХреНрд╢рди рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ, рдбреАрдПрдирдПрд╕ рдХреИрд╢ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ рдХрд╛ рддреБрд░рдВрдд рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдбреАрдПрдирдПрд╕ рд░рд╛рдЙрдВрдб-рд░реЙрдмрд┐рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд┐рдВрдЧ рдХреЗ рдкрддреЗ рдкрд░ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реИред

рдПрдХ "рд╕рд╛рдорд╛рдиреНрдп" .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ ServicePointManager рдФрд░ ServicePoint (рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • ServicePointManager.DnsRefreshTimeout - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдбреЛрдореЗрди рдирд╛рдо рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдЖрдИрдкреА рдкрддреЗ рдХреЛ рдХрд┐рддрдиреА рджреЗрд░ рддрдХ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди 2 рдорд┐рдирдЯ (120000) рд╣реИред
  • ServicePoint.ConnectionLeaseTimeout - рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдХрд┐рддрдиреЗ рд╕рдордп рддрдХ рдЦреБрд▓рд╛ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдордп рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИ; рдХреЛрдИ рднреА рдХрдиреЗрдХреНрд╢рди рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ -1 рд╣реИред рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЗрд╕реЗ 0 рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
  • ServicePoint.MaxIdleTime - рдХрдиреЗрдХреНрд╢рди рдХреА рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХреЗ рд╕рдордп рдХреЗ рдмрд╛рдж рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдИ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдирд╣реАрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди 100 рд╕реЗрдХрдВрдб (100000) рд╣реИред

рдЕрдм, рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдордЭ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рд╕рднреА рдХреЛ рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдХрд┐рд╕реА рдиреЗ DnsRefreshTimeout рдФрд░ MaxIdleTime рдХреЛ рдирд╣реАрдВ рдмрджрд▓рд╛ рдФрд░ рд╡реЗ рдХреНрд░рдорд╢рдГ 120 рдФрд░ 100 рд╕реЗрдХрдВрдб рдХреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде, ConnectionLeaseTimeout рдХреЛ 60 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗрд╡рд▓ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рд╣рд░ 10 рд╕реЗрдХрдВрдб рдореЗрдВ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред

рдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде, рдХрдиреЗрдХреНрд╢рди рд╣рд░ 60 рд╕реЗрдХрдВрдб (ConnectionLeaseTimeout) рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рднрд▓реЗ рд╣реА рдпрд╣ рд╕рдордп-рд╕рдордп рдкрд░ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдорд╛рдкрди рдФрд░ рдкреБрди: рдирд┐рд░реНрдорд╛рдг рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╣реА рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░рдирд╛ - рдпрджрд┐ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд▓рд╣рд╛рд▓ рдЕрдиреБрд░реЛрдз рдЕрднреА рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЬрдм рднреА рдХреЛрдИ рдХрдиреЗрдХреНрд╢рди рджреЛрдмрд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд IP рдкрддреЗ рдХреЛ рдкрд╣рд▓реЗ рдХреИрд╢ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдЙрд╕рдХрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реЛ (120 рд╕реЗрдХрдВрдб), рд╕рд┐рд╕реНрдЯрдо DNS рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдЧрд╛ред

MaxIdleTime рдкреИрд░рд╛рдореАрдЯрд░ рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдХреЛрдИ рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрдиреЗрдХреНрд╢рди 10 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИред

рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЗрд╖реНрдЯрддрдо рдЕрдиреБрдкрд╛рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдФрд░ рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:

  • рдпрджрд┐ рдЖрдк рдЙрд╕ рдбреЛрдореЗрди рдирд╛рдо рдХреЗ рдкреАрдЫреЗ рдЖрдИрдкреА рдкрддреЗ рдХреЛ рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдФрд░ рдЙрд╕реА рд╕рдордп рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рди рдХреА рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдПрдХ рдЕрдЪреНрдЫреЗ рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВред
  • рдпрджрд┐ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдИрдкреА рдкрддреЗ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк DnsRefreshTimeout рдХреЛ 0 рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рдХреЗ рд▓рд┐рдП ConnectionLeaseTimeout рдЖрдкрдХреЛ рд╕реВрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреМрди рд╕рд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рддрдиреА рдЬрд▓реНрджреА рджреВрд╕рд░реЗ рдЖрдИрдкреА рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЖрдк рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╕рдВрднрд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдЗрд╖реНрдЯрддрдо рдореВрд▓реНрдп рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рддрд░рдл, рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╕рдордп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░реА рддрд░рдл, рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдереНрд░реВрдкреБрдЯ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдХреЛ рдиреАрдЪрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
  • рдпрджрд┐ рдЖрдкрдХреЛ рдЖрдИрдкреА рдкрддреЗ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╕рдВрднрд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ DNS рд░рд╛рдЙрдВрдб-рд░реЙрдмрд┐рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрддреБрд▓рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк DnsRefreshTimeout рдФрд░ ConnectionLeaseTimeout рдХреЛ 0 рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдмреЗрдХрд╛рд░ рд╣реЛрдЧрд╛, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, DNS рд╕рд░реНрд╡рд░ рдХреЛ рдкрд╣рд▓реЗ рдорддрджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд▓рдХреНрд╖реНрдп рдиреЛрдб рдХрд╛ рдХрдиреЗрдХреНрд╢рди рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрд╣рд╛рдВ рдмрд┐рдирд╛ рд╢реВрдиреНрдп-рд╢реВрдиреНрдп DnsRefreshTimeout рдХреЗ рд╕рд╛рде ConnectionLeaseTimeout рдХреЛ 0 рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрддрд╛ред рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рдХрдиреЗрдХреНрд╢рди рдирдП рд╕рд┐рд░реЗ рд╕реЗ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ рдХреИрд╢ рд╕реЗ рдЖрдИрдкреА рдкрддреЗ рд▓рд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 var client = new HttpClient(); ServicePointManager.DnsRefreshTimeout = 120000; var habrServicePoint = ServicePointManager.FindServicePoint(new Uri("https://habr.com")); habrServicePoint.MaxIdleTime = 100000; habrServicePoint.ConnectionLeaseTimeout = 60000; while (true) { client.GetAsync("https://habr.com").Wait(); Thread.Sleep(10000); } 

рдЬрдмрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реВрдк рдореЗрдВ рдкрд╛рд╡рд░рд╢реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрдЯрд╕реНрдЯреИрдЯ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рддреБрд░рдВрдд рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ .NET рдХреЛрд░ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред ConnectionLimit рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, ServicePointManager рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреАред рдХреЛрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ HTTP рд╣реИрдВрдбрд▓рд░ рд╣реИ, рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рджреЛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ - рд╕реЙрдХреЗрдЯреНрд╕рд╣реИрдкрд╣реИрдВрдбрд▓рд░:

 var handler = new SocketsHttpHandler(); handler.PooledConnectionLifetime = TimeSpan.FromSeconds(60); // ConnectionLeaseTimeout handler.PooledConnectionIdleTimeout = TimeSpan.FromSeconds(100); // MaxIdleTime var client = new HttpClient(handler); 

рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ .NET рдХреЛрд░ рдореЗрдВ DNS рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдХреИрд╢рд┐рдВрдЧ рд╕рдордп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╢рд┐рдВрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдирдпрд╛ рдбреАрдПрдирдПрд╕ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рддреЗ рд╕рдордп, рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдлрд┐рд░ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЬрдм рдЕрдиреБрд░реЛрдзрд┐рдд рдбреЛрдореЗрди рдирд╛рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдИрдкреА рдкрддреЗ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдЗрдЪреНрдЫрд┐рдд рдореВрд▓реНрдп рдкрд░ PooledConnectionLifetime рд╕реЗрдЯ рдХрд░реЗрдВред

рд╕рднреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП, .NET рдХреЛрд░ 2.1 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдЬреЛ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - https://docs.microsoft.com/en- us / dotnet / standard / microservices-рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ / рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рд▓рдЪреАрд▓рд╛-рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдЙрдкрдпреЛрдЧ-httpclientfactory-to-implement-resilient-http-request ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдиреЗрдХреНрд╢рди рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирдпрд╛ рдШрдЯрдХ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреБрдЫ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЗрдВ рднреАред рдЗрд╕ рд▓реЗрдЦ рдФрд░ рдЗрд╕рд╕реЗ рд▓рд┐рдВрдХ рдореЗрдВ HttpClientFactory рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред

Source: https://habr.com/ru/post/hi424873/


All Articles