简单,极致~~

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

项目里使用httpclient一般加staic或者单例来防止每次请求都会新建立一个连接,从而占用太多的服务器资源,

问题产生


 但是今天新加的一个方法中每次需要请求不同的url,这时候就出现了错误:

  就是说该连接已经由其他请求占着了,必须等前面的请求完成了,才能修改属性(baseurl),what? 每次都new肯定也不行呀,这要咋整!!

 一番百度,发现在.net core 2.1的时候引入了httpclientfactory, 它会维护一个连接池并自动判断何时复用何时新建连接,比较好的解决了这个问题,

使用方法如下:

1.startup中注册:


 publicvoid ConfigureServices(IServiceCollection services)

{
     services.AddHttpClient();
     services.AddMvc();
 }

2.controller中调用


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();
    }
}
View Code

 

 

 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

 

posted on 2020-05-12 18:50  Linky008  阅读(1290)  评论(0编辑  收藏  举报