温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#如何使用HttpClient

发布时间:2022-03-03 13:55:33 来源:亿速云 阅读:443 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关C#如何使用HttpClient的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

    错误使用

    New HttpClient

    如下面一段代码,日常开发中经常使用的 call http 方式,每次 new 一个 HttpClient

    using(var client = new HttpClient())

    先来做一个简单的测试,循环 call 一个 url ,代码如下

    public async Task<string> GetXXXUrlAsync(string url)
     {
         var html = "";
         for (var i = 0; i < 20; i++)
         {
              using (var client = new System.Net.Http.HttpClient())
              {
                 var result=await client.GetStringAsync(url);
                 html += result;
               }
         }
         return html;
     }

    运行项目输出结果后,通过 netstate 查看下 TCP 连接情况

    C:\Windows\System32> netstat

    虽然项目已经运行结束,但是连接依然存在,状态为" TIME_WAIT"(继续等待看是否还有延迟的包会传输过来;默认在 windows 下,TIME_WAIT 状态将会使系统将会保持该连接 240s。在高并发的情况下,连接来不及释放,socket 被耗尽,耗尽之后就会出现喜闻乐见的一个错误。

    C#如何使用HttpClient

    错误原因,对象所占用资源应该确保及时被释放掉,但是,对于网络连接而言,这是错误的,原因有如下:

    • 网络连接是需要耗费一定时间的,频繁开启与关闭连接,性能会受影响

    • 开启网络连接时会占用底层 socket 资源,但在 HttpClient 调用其本身的 Dispose 方法时,并不能立刻释放该底层 socket 资源,这意味着程序可能会因为耗尽连接资源而产生灾难性的问题

    对于上面的错误,大家可能会想到使用静态单例模式的 HttpClient,接着往下看

    static HttpClient

    private static HttpClient Client = new HttpClient();

    静态单例模式虽然可以解决上面问题,但是会带来另外一个问题:DNS 变更会导致不能解析,DNS 不会重新加载,需要重启才能变更。(这样演示相对负复杂,有兴趣的可以去尝试一下)

    正确使用

    HttpClientFactory 以模块化、可命名、可配置、弹性方式重建了 HttpClient 的使用方式,由 DI 框架注入 IHttpClientFactory 工厂,由工厂创建 HttpClient 并从内部的 Handler 池分配请求 Handler 。

    HttpClientFactory 创建的 HttpClient,也即是 HttpClientHandler,只是这些个 HttpClien t被放到了“池子”中,工厂每次在 create 的时候会自动判断是新建还是复用 (默认生命周期为2min)。

    C#如何使用HttpClient

    .net core 2.1 开始引入了 IHttpClientFactory 工厂类来自动管理 IHttpClientFactory 类的创建和资源释放,可以通过 Ioc 注入方式进行使用

    services.AddControllers();
    services.AddHttpClient();

    IHttpClientFactory 使用方法,简略代码如下

    private readonly IHttpClientFactory _clientFactory;
    
    public HomeController(IHttpClientFactory clientFactory)
    {
        _clientFactory = clientFactory;
    }
    
    public async Task<string> GetBaiduAsync(string url)
    {
        var client = _clientFactory.CreateClient();
        var result = await client.GetStringAsync(url);
        return result;
    }

    感谢各位的阅读!关于“C#如何使用HttpClient”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI