首页 > Web开发 > 详细

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

时间:2020-05-12 20:33:35      阅读:101      评论:0      收藏:0      [点我收藏+]

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

 

3.不在controller中调用时,可通过传入当前的httpcontext等方法来获取实例


 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

 

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!