Partout, je peux voir trois approches principales pour créer des clients (basiques, nommés, tapés) en DI, mais je n'ai trouvé nulle part où injecter IHttpClientFactory
ou HttpClient
(les deux possibles).
Q1: Quelle est la différence entre l'injection de IHttpClientFactory
ou HttpClient
s'il vous plaît?
Q2: Et si IHttpClientFactory
est injecté, dois-je utiliser factory.CreateClient()
pour chaque appel?
HttpClient
ne peut être injecté qu'à l'intérieur Typed clientsIHttpClientFactory
HttpClientMessageHandler
est gérée par le framework, vous ne vous inquiétez donc pas de la suppression (incorrecte) du HttpClients
.Afin d'injecter directement HttpClient
, vous devez enregistrer un service Typed spécifique qui recevra le client:
services.AddHttpClient<GithubClient>(c => c.BaseAddress = new System.Uri("https://api.github.com"));
Maintenant, nous pouvons l'injecter dans le typé GithubClient
public class GithubClient
{
public GithubClient(HttpClient client)
{
// client.BaseAddress is "https://api.github.com"
}
}
Vous ne pouvez pas injecter le HttpClient
à l'intérieur de AnotherClient
, car il n'est pas tapé à AnotherClient
public class AnotherClient
{
public AnotherClient(HttpClient client)
{
// InvalidOperationException, can't resolve HttpClient
}
}
Vous pouvez cependant:
1. Injectez le IHttpClientFactory
et appelez CreateClient()
. Ce client aura BaseAddress
défini sur null
.
2. Ou configurez AnotherClient
comme un client typé différent avec, par exemple, un BaseAdress
différent.
Sur la base de votre commentaire, vous enregistrez un client Named. Il est toujours résolu à partir de la méthode IHttpClientFactory.CreateClient (), mais vous devez passer le 'nom' du client
Inscription
services.AddHttpClient("githubClient", c => c.BaseAddress = new System.Uri("https://api.github.com"));
tilisation
// note that we inject IHttpClientFactory
public HomeController(IHttpClientFactory factory)
{
this.defaultClient = factory.CreateClient(); // BaseAddress: null
this.namedClient = factory.CreateClient("githubClient"); // BaseAddress: "https://api.github.com"
}
Malheureusement, je ne peux pas commenter, mais seulement publier une réponse. Par conséquent, je vous suggère de consulter les liens suivants:
https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
En ce qui concerne vos questions, cela se résume plus ou moins à ceci:
Q1 -> IHttpClientFactory gère les pools de connexions des instances HttpClient et cela vous aidera à résoudre les problèmes de chargement et d'élimination tels que décrits dans les liens, si HttpClient est utilisé faux.
Q2 -> oui, vous devez utiliser le client factory.create selon les documents Microsoft