Сводка
HttpClient
можно вводить только внутрь Типизированные клиенты - для других целей, вам необходимо
IHttpClientFactory
- В обоих сценариях время жизни
HttpClientMessageHandler
управляется платформой, поэтому вас не беспокоит (неправильно) утилизация HttpClients
.
Примеры
Для того, чтобынепосредственно введите HttpClient
, вам нужно зарегистрировать определенную типизированную службу, которая будет получать клиент:
services.AddHttpClient<GithubClient>(c => c.BaseAddress = new System.Uri("https://api.github.com"));
Теперь мы можем внедрить это внутри , набранного GithubClient
public class GithubClient
{
public GithubClient(HttpClient client)
{
// client.BaseAddress is "https://api.github.com"
}
}
Вы не можете ввести HttpClient
внутрь AnotherClient
, потому что не набирается до AnotherClient
public class AnotherClient
{
public AnotherClient(HttpClient client)
{
// InvalidOperationException, can't resolve HttpClient
}
}
Вы можете,однако:
1. Введите IHttpClientFactory
и позвоните CreateClient()
. У этого клиента будет BaseAddress
, установленный на null
.
2. Или настроить AnotherClient
как другой типизированный клиент с, например, другим BaseAdress
.
Обновлением
На основании вашего комментария вы регистрируете клиента Named . Он все еще разрешается с помощью метода IHttpClientFactory.CreateClient (), но вам необходимо передать «имя» клиента
Регистрация
services.AddHttpClient("githubClient", c => c.BaseAddress = new System.Uri("https://api.github.com"));
Использование
// 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"
}