我在任何地方都可以看到在DI中创建客户机(basic、命名、类型化)的三种主要方法,但是如果注入IHttpClientFactory或HttpClient (两者都可能),我已经找不到任何地方了。
Q1:请问注射IHttpClientFactory和HttpClient有什么区别?
Q2:如果IHttpClientFactory被注入,我应该在每个调用中使用factory.CreateClient()吗?
发布于 2019-12-11 08:04:46
摘要
HttpClient只能被注入到类型的客户端IHttpClientFactoryHttpClientMessageHandler的生存期由框架管理,所以您不会担心(错误地)处理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
}
}但是,你可以:
IHttpClientFactory并调用CreateClient()。这个客户端将null.BaseAddress,将AnotherClient配置为不同类型的客户机,例如,使用不同的BaseAdress.更新
根据您的评论,您正在注册一个名为的客户端。它仍然是从IHttpClientFactory.CreateClient()方法解析的,但是您需要传递客户机的“名称”
Registration
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"
}发布于 2019-12-11 08:10:10
遗憾的是,我不能发表评论,但只是张贴一个答复。因此,我建议您查看以下链接:
https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
关于你的问题,大致可以归结为:
Q1 -> IHttpClientFactory处理HttpClient实例的连接池,如果HttpClient使用错误,这将帮助您将加载和处理问题视为链接中的描述。
Q2 ->是的,根据microsoft文档,您应该使用factory.create客户端。
https://stackoverflow.com/questions/59280153
复制相似问题