.net core中使用HttpClient碰到的问题:This instance has already started one or more requests. Properties can only be modified before sending the first request

项目里使用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

原文地址:https://www.cnblogs.com/Linky008/p/12878008.html