【发布时间】:2019-04-01 11:54:17
【问题描述】:
我们目前正在使用HttpClient 从 MVC 应用程序调用 Web API。
HttpClient 是静态助手类的一部分,如下所示
public static class ApiClient
{
private static HttpClient MyHttpClient()
{
HttpClient client = new HttpClient();
...
return client;
}
public static T HttpGet<T>(string requestUri)
{
using (var client = MyHttpClient())
{
...
}
}
}
它是从 MVC 控制器调用的,如下所示
ApiClient.HttpGet<MyModel>("<<API URL>>");
因此,每当调用 ApiClient 时,都会打开一个新的底层连接,这不是正确的方式。
我阅读了HttpClientFactory 并阅读了这个post 并导致将创建逻辑修改为
private static HttpClient MyHttpClient()
{
var serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();
var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
var client = httpClientFactory.CreateClient();
//HttpClient client = new HttpClient();
...
return client;
}
即使多次调用,这是否会阻止打开多个连接?
【问题讨论】:
-
@PavelAnikhouski 是的!出于同样的原因,我想使用问题后面部分中描述的 HttpClientFactory。
-
顺便说一句,你的“创作逻辑”是完全错误的。你应该永远创建一个新的
ServiceCollection。你应该在需要HttpClient的地方注入IHttpClientFactory -
@CamiloTerevinto 同意。由于 'ApiClient' 类被声明为静态,我将能够注入 'IHttpClientFactory ',这就是我无法继续进行的地方。如果您能提供一些见解,将会很有帮助。
-
你不能用单例代替吗?
-
@CamiloTerevinto 是的,单例可能会有所帮助,但 IHttpClientFactory 似乎可用于解决这种确切情况,因此我想使用它。我不介意在从 MVC 调用 API 时更改调用 ApiClient 的方式。
标签: c# asp.net-core httpclient httpclientfactory