Digamos que tenemos un código como este:
services.AddHttpClient(); services.AddSingleton<IMyService, MyService>(); ... public class MyService : IMyService { public MyService(HttpClient httpClient) { } }Hay preguntas (probablemente estúpidas, pero solo quiero aclarar algunas cosas):
HttpClientFactory para crear una instancia de HttpClient ?HttpClientFactory , pero ¿tendrá problemas con los cambios de DNS en ese caso? No está del todo claro si HttpMessageHandler s se administrará para servicios singleton y si el servicio debe tener un alcance de todos modos para obtener todos los beneficios del uso de HttpClientFactory .
- ¿
HttpClientFactorypara crear una instancia deHttpClient?
Si. Un HttpClient predeterminado se registra como un servicio transitorio durante el registro de HttpClientFactory .
- Supongo que usa
HttpClientFactory, pero ¿tendrá problemas con los cambios de DNS en ese caso?
Correcto, todavía lo haría. A medida que lo inyecta en un singleton, HttpClient aquí se creará solo una vez. Para hacer uso de la agrupación HttpMessageHandler de HttpClientFactory , necesitará que sus HttpClient s sean de corta duración. Entonces, para esto, preferiría inyectar IHttpClientFactory y llamar a CreateClient cuando lo necesite. (Tenga en cuenta que los HttpClient de corta duración solo se aplican al uso de HttpClientFactory ). Por cierto, cambiar a un cliente escrito no ayudará cuando se inyecte en un singleton, HttpClient terminará siendo creado solo una vez, consulte https://github.com/dotnet/runtime/issues/64034 .
Además, puede evitar HttpClientFactory por completo y seguir respetando los cambios de DNS. Para eso, puede tener un HttpClient estático/singleton con PooledConnectionLifetime establecido en un tiempo de espera razonable (por ejemplo, los mismos 2 minutos que tiene HttpClientFactory )
services.AddSingleton(() => new HttpClient( new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(2) } ));