Повторное использование httpclient в основном веб-приложении mvc.net с несколькими apis и строками запросов - PullRequest
0 голосов
/ 01 июня 2018

Я прочитал много противоречивых ответов по этому поводу, но до сих пор не совсем понял.У меня есть веб-приложение .net core 1.1, которое использует множество внешних API для различных источников данных.Моя текущая реализация использует DI для передачи пользовательского класса "webclient" каждому контроллеру, который внутренне создает и удаляет httpclient для каждого запроса (внутри блока using).Я вижу тонну неактивных соединений на сервере, поэтому я почти уверен, что это вызывает их.У меня также есть некоторые проблемы с аварийным завершением приложения ядра .net, и я больше не отвечаю, поэтому мне интересно, создает ли слишком много открытых соединений эту проблему.

Я понимаю, что httpclient может быть многократно использован для многих соединений, но я не совсем уверен в некоторых вещах.Я читал, что повторное использование одного и того же httpclient действительно более полезно для толстых клиентских приложений и не так полезно для веб-приложений из-за очень параллельного характера веб-запросов.Я также читал, что вы хотите кэшировать один и тот же httpclient для повторного использования для отдельного URL, но мой URL использует строки запросов для передачи параметров, поэтому не значит ли это, что каждый полностью квалифицированный URL уникален среди других?

Моя идея состоит в том, чтобы, возможно, кэшировать один экземпляр httpclient для каждого базового доменного имени API, к которому я обращаюсь, но я не нашел подтверждения, если бы это дало те преимущества, которые я ищу при использовании одного экземпляра httpclient.Я предполагаю, что моя цель состоит в том, чтобы повторно использовать бездействующие соединения, это достигнет этого?

Я также натолкнулся на ссылку на решение, похожее на то, что я делаю, которое будет кэшировать эти экземпляры, но затем проверять, не уничтожился ли какой-либо из них в какой-то момент, и воссоздавать их по мере необходимости.

Кажется, это должно быть легко, но есть масса противоречивой информации!

1 Ответ

0 голосов
/ 01 июня 2018

HttpClient потенциально может оставаться открытым в течение жизненного цикла приложения или дольше, даже если он реализует IDisposable.Таким образом, вы на правильном пути, используя один экземпляр HttpClient, потому что вы гарантированно можете открыть только одно соединение в любое время.

.NET Core имеет вспомогательные функции для DI.Если вы используете следующее, единственный экземпляр вашего веб-клиента будет внедрен во все классы, которые его используют.Это означает, что каждый класс будет использовать один и тот же экземпляр объекта webclient, поэтому используйте один и тот же httpclient.

Используйте в вашем файле startup.cs следующую функцию ConfigureServices:

services.AddSingleton<IWebClient>(new webclient(params));    

или

services.AddSingleton<IWebClient, webclient>();

Службы времени жизни Singleton создаются при первом запросе (или при запуске ConfigureServices, если вы указываете экземпляр там), а затем каждый последующий запрос будет использовать тот же экземпляр.Если вашему приложению требуется одноэлементное поведение, рекомендуется разрешить контейнеру сервисов управлять временем жизни сервиса вместо того, чтобы реализовывать шаблон проектирования одноэлементного режима и управлять временем жизни вашего объекта в классе самостоятельно.

Документация Microsoft дляDI в .NET Core

...