项目里使用httpclient一般加staic或者单例来防止每次请求都会新建立一个连接,从而占用太多的服务器资源,
问题产生
但是今天新加的一个方法中每次需要请求不同的url,这时候就出现了错误:
就是说该连接已经由其他请求占着了,必须等前面的请求完成了,才能修改属性(baseurl),what? 每次都new肯定也不行呀,这要咋整!!
一番百度,发现在.net core 2.1的时候引入了httpclientfactory, 它会维护一个连接池并自动判断何时复用何时新建连接,比较好的解决了这个问题,
使用方法如下:
1.startup中注册:
publicvoid ConfigureServices(IServiceCollection services)
{
services.AddHttpClient();
services.AddMvc();
}
2.controller中调用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class MyController : Controller { IHttpClientFactory _httpClientFactory; public MyController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } public IActionResult Index() { var client = _httpClientFactory.CreateClient(); var result = client.GetStringAsync("http://myurl/"); return View(); } }
IHttpClientFactory的实现类DefaultHttpClientFactory是internal访问权限,意味着你不能直接通过new的方式生成所需的HttpClientFactory。
所以你只能通过AddHttpClient方法在ASP.NET Core的DI容器中注册IHttpClientFactory。然后再想办法获取已注册接口的实例。
有一种方式是借助WebHost类的Services属性,它的IServiceProvider类型的值具有GetService方法,可以获取实例。
另一种方式是借助HttpContext的RequestServices属性,一样可以获取实例。
参考:
https://www.cnblogs.com/kenwoo/p/9333042.html
https://www.jianshu.com/p/732aee097c6b?from=timeline
https://www.cnblogs.com/dudu/p/http-client-factory.html