在开发的过程中,遇到过这种带Factory的对象。先不扯什么工厂类,我也不知道跟工厂类有没有关联,还没有百度。
当需要向某特定URL地址发送HTTP请求并得到相应响应时,通常会用到HttpClient类。
该类包含了众多有用的方法,可以满足绝大多数的需求。但是如果对其使用不当时,可能会出现意想不到的事情。
using(var client = new HttpClient())
对象所占用资源应该确保及时被释放掉,但是,对于网络连接而言,这是错误的。
原因有二,
1:网络连接是需要耗费一定时间的,频繁开启与关闭连接,性能会受影响;
2:开启网络连接时会占用底层socket资源,但在HttpClient调用其本身的Dispose方法时,并不能立刻释放该资源,这意味着你的程序可能会因为耗尽连接资源而产生预期之外的异常。
所以比较好的解决方法是延长HttpClient对象的使用寿命,比如对其建一个静态的对象:
private static HttpClient Client = new HttpClient();
但从程序员的角度来看,这样的代码或许不够优雅。
所以在.NET Core 2.1中引入了新的HttpClientFactory类。
它的用法很简单,首先是对其进行IoC的注册:
1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddHttpClient(); 4 services.AddMvc(); 5 }
然后通过IHttpClientFactory创建一个HttpClient对象,之后的操作如旧,但不需要担心其内部资源的释放:
public class LzzDemoController : Controller { IHttpClientFactory _httpClientFactory; public LzzDemoController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } public IActionResult Index() { var client = _httpClientFactory.CreateClient(); var result = client.GetStringAsync("http://myurl/"); return View(); } }