zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    D
    洛谷P2002 消息扩散
    洛谷P5058 [ZJOI2004]嗅探器
    洛谷P2746 校园网Network of Schools
    洛谷P3388 【模板】割点(割顶)
    洛谷P1407 [国家集训队]稳定婚姻
    2018年12月18日
    洛谷P1547 Out of Hay
    洛谷P4018 Roy&October之取石子
    洛谷P1318 积水面积
  • 原文地址:https://www.cnblogs.com/Linky008/p/12878008.html
Copyright © 2011-2022 走看看