zoukankan      html  css  js  c++  java
  • 修复.NET的HttpClient

    看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料!

    \

    早在2016年我们就报道过 ,.NET的HttpClient存在一些问题。随着.NET Core 2.1中HttpClientFactory的引入,其中部分问题已经得到缓解。

    \

    HttpClient的根本问题是,每次调用资源好像都应该在使用后立即释放。在现实中,那意味着每个目标服务器都要创建一次,然后在应用程序运行期间一直保留。除非是,比如说,需要清理DNS缓存。

    \

    新增的HttpClientFactory让用户可以在应用程序启动时预先配置HttpClient。每项配置都有名称,让使用正确的配置请求HttpClient变得简单。为了防止用户不需要自定义配置,它也提供了未命名配置。

    \

    考虑到字符串容易出错,HttpClient的配置可以指定为特定的类型。例如,用户可以创建GitHubService类配置。然后,DI框架会确保为使用那个配置而非默认配置的HttpClient提供GitHubService实例。

    \

    这个管理HttpClient的新框架不会改变基本的使用规则:销毁HttpClient仍然是危险的。对于DNS缓存问题,Karel Zikmund写到:

    \

    我们正在积极地讨论设计,以期直接在ManagedHandler中解决DNS变化问题。目前,我们正在考虑两个选项:要么支持DNS TTL(#24257),要么是类似ConnectionLeaseTimeout这样的API(#26331)。我们会结合2.1中的HttpClientFactory确保DNS变化的情况得到解决。

    \

    消息处理程序和自动重试

    \

    HttpClient有一个鲜为人知的特性是能够添加消息处理程序。开箱即用,HttpClientHandler控制着诸如是否允许自动重定向(Cookie容器会用到)、预认证如何发挥作用这样的特性。

    \

    通过实现DelegatingHandler的子类可以进一步扩展。在Channel 9的一个示例中,Daniel Roth展示了如何创建一个简单的重试处理程序。

    \

    HttpClientFactory完善了这个特性,它允许开发人员将HttpClientHandler作为HttpClient配置的一部分。这是有意为DI提供便利。

    \

    SocketHttpHandler

    \

    HttpClientHandler子系统不只是为了改变行为,它还可以完全改变HttpClient与网络通信的方式。微软正在通过引入SocketHttpHandler对此加以利用。这是一个“全新的托管HttpClientHandler”,可以消除对“libcurl (对于Linux)和WinHTTP(对于Windows)的平台依赖”。公告继续写到:

    \

    对于预览版1,用户可以通过下面两种方式中的一种使用SocketHTTPHandler:

    \

    环境变量:COMPlus_UseManagedHttpClientHandler=true
    AppContext:System.Net.Http.UseManagedHttpClientHandler=true

    \

    用户也可以开启ASP.NET的套接字模式。随着当前原生实现的引入,这最终可能会成为默认设置。

    \

    查看英文原文Fixing .NET’s HttpClient

  • 相关阅读:
    正确添加Google Adsense
    微软开发主管临别诤言
    DZ论坛重建管理员
    Cook book 第4天 第6章 层、自定义组件
    Cook Book 第二天 运行环境识别修改
    flex cookbook 学习第一天 基本知识
    C#:String类型中的CharAt
    对我学C#时的一次小回忆[一:语法篇]
    分享一段C#反射代码[Type是反射的入口][查看类型信息][动态生成对象]
    C#反射:让私有成员无所遁形
  • 原文地址:https://www.cnblogs.com/twodog/p/12137400.html
Copyright © 2011-2022 走看看