当前位置: 首页 > news >正文

做外汇网站代理赚钱吗怎么让百度收录网站所有网页

做外汇网站代理赚钱吗,怎么让百度收录网站所有网页,wordpress wp-polls,洛阳网站开发译者荐语#xff1a;使用.NET Core的HttpClient连接池管理有哪些注意事项#xff1f;本文给出了非常中肯的建议。原文来自互联网#xff0c;由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权#xff0c;请联系小编#xff0c;小编将在24小时内删除。本文来源[1]史蒂… 译者荐语使用.NET Core的HttpClient连接池管理有哪些注意事项本文给出了非常中肯的建议。原文来自互联网由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权请联系小编小编将在24小时内删除。本文来源[1]史蒂夫·戈登Steve Gordon是Microsoft MVPPluralsight的作者布莱顿英国西南部城市的高级开发人员和社区负责人。他的个人博客为www.stevejgordon.co.uk[2]。导读.NET Core从2.1开始中的HttpClient执行连接池和这些连接的生命周期管理。这支持使用单个HttpClient实例通过单例减少了套接字耗尽的机会同时确保连接定期重新连接以反映DNS更改。回顾HttpClient的历史HttpClient最初是作为NuGet包开始的该包可以选择包含在.NET Framework 4.0项目中。在.NET Framework 4.5中它作为BCL基本类库的一部分在框中提供。它建立在预先存在的HttpWebRequest实现之上。在.NET Framework中ServicePoint API可用于控制和管理HTTP连接包括通过为端点配置ConnectionLeaseTimeout来设置连接寿命。图片.NET Core 1.0最初于2016年6月发布。与.NET Framework中可用的版本相比此第一个版本的API接口要小得多主要用于构建ASP.NET Core Web应用程序。由于.NET Core 1.0是HttpClient因此提供了API。但是不包括用于HttpWebRequest和ServicePoint的API。.NET Core 1.0中的HttpClient直接建立在使用非托管代码的OS平台API之上Windows API使用WinHTTPLinux和Mac使用LibCurl。图片到2016年8月很快就注意到重新使用HttpClient实例以防止套接字耗尽的建议有一个相当麻烦的副作用。Oren Novotny译者注.NET基金会执行董事.NET团队的项目经理揭开了一个长期存在的GitHub问题题为“ Singleton HttpClient doesn’t respect DNS changes[3] ”(单例HttpClient不遵守DNS 更改。在此问题中人们认识到重新使用单个HttpClient实例将导致连接无限期保持打开状态因此DNS更改可能会导致请求失败或与过时的终结点通信。在.NET Core 2.0中添加了HttpWebRequest以支持.NET Standard 2.0。它位于HttpClient实现的顶层这与.NET Framework 4.5中的工作原理相反。还添加了ServicePoint尽管它的许多API接口要么要么会抛出未实现的异常要么根本就没有实现。图片自.NET CORE 2.1以来的变化这种有问题的行为导致团队不同团队进行了两项工作。ASP.NET团队开始研究Microsoft.Extensions.Http包该包的主要功能是IHttpClientFactory。这个针对HttpClient实例专用的工厂还包括基础HttpMessageHandler链的生命周期管理。如果您想了解有关此功能的更多信息可以查看我的系列博客文章[4]我将在此介绍。IHttpClientFactory功能是作为ASP.NET Core 2.1的一部分发布的对于许多人来说这是一个很好的折中方案它解决了连接重用以及生命周期管理的问题。在同一时间范围内.NET团队正在研究自己的解决方案。该团队也在.NET Core 2.1中发布在HttpClient的处理程序链的核心引入了一个新的SocketsHttpHandler。该处理程序直接建立在Socket API之上并在托管代码中实现HTTP。这项工作的一部分包括连接池系统以及为这些连接设置最大生存期的能力。此功能将是本文其余部分的重点。图片但是在开始之前我想指出虽然默认情况下从.NET Core 2.1启用了SocketsHttpHandler但实现仅限于HTTP / 1.1通信。那些需要HTTP / 2的用户必须禁用该功能并使用较旧的处理程序链该处理程序链像以前一样依赖非托管代码并且不包括连接池。幸运的是.NET Core 3.0中已消除了此限制并且现在提供了HTTP/2支持。这应该使用基于适合所有对象的SocketsHttpHandler链的HttpClient。什么是连接池SocketsHttpHandler为每个唯一端点建立连接池您的应用程序通过HttpClient向该唯一端点发出出站HTTP请求。在对端点的第一个请求上当不存在现有连接时将建立一个新的HTTP连接并将其用于该请求。该请求完成后连接将保持打开状态并返回到池中。对同一端点的后续请求将尝试从池中找到可用的连接。如果没有可用的连接并且尚未达到该端点的连接限制则将建立新的连接。达到连接限制后请求将保留在队列中直到连接可以自由发送它们为止。我一直在研究此实现的内部代码并可能在以后的博客文章中对池的行为进行更深入的分析。如何控制连接池有三个主要设置可用于控制连接池的行为。PooledConnectionLifetime定义连接在池中保持活动状态的时间。此生存期到期后将不再为将来的请求而合并或发出连接。PooledConnectionIdleTimeout定义闲置连接在未使用时在池中保留的时间。一旦此生存期到期空闲连接将被清除并从池中删除。MaxConnectionsPerServer定义每个端点将建立的最大出站连接数。每个端点的连接分别池化。例如如果最大连接数为2则您的应用程序将请求发送到两个www.github.com[5]和www.google.com[6]总共可能最多有4个打开的连接。默认情况下从.NET Core 2.1开始更高级别的HttpClientHandler将SocketsHttpHandler用作内部处理程序。没有任何自定义配置将应用连接池的默认设置。该PooledConnectionLifetime默认是无限的因此虽然经常使用的请求连接可能会无限期地保持打开状态。该PooledConnectionIdleTimeout默认为2分钟如果在连接池中长时间未使用将被清理。MaxConnectionsPerServer默认为int.MaxValue因此连接基本上不受限制。如果希望控制这些值中的任何一个则可以手动创建SocketsHttpHandler实例并根据需要进行配置。var socketsHandler new SocketsHttpHandler{PooledConnectionLifetime TimeSpan.FromMinutes(10),PooledConnectionIdleTimeout TimeSpan.FromMinutes(5),MaxConnectionsPerServer 10};var client new HttpClient(socketsHandler); 在前面的示例中对SocketsHttpHandler进行了配置以使连接将最多在10分钟后停止重新发出并关闭。如果闲置5分钟则连接将在池的清理过程中被更早地删除。我们还将最大连接数每个端点限制为十个。如果我们需要并行发出更多出站请求则某些请求可能会排队等待直到10个池中的连接可用为止。要应用处理程序它将被传递到HttpClient的构造函数中。测试连接寿命以这个示例程序为例using System;using System.Net.Http;using System.Threading.Tasks;namespace HttpConnectionPoolingSamples{class Program{static async Task Main(string[] args){var ips await Dns.GetHostAddressesAsync(www.google.com);foreach (var ipAddress in ips){Console.WriteLine(ipAddress.MapToIPv4().ToString());}var socketsHandler new SocketsHttpHandler{PooledConnectionLifetime TimeSpan.FromMinutes(10),PooledConnectionIdleTimeout TimeSpan.FromMinutes(5),MaxConnectionsPerServer 10};var client new HttpClient(socketsHandler);for (var i 0; i 5; i){_ await client.GetAsync(https://www.google.com);await Task.Delay(TimeSpan.FromSeconds(2));}Console.WriteLine(Press a key to exit...);Console.ReadKey();}}} 使用我们刚刚讨论的设置此代码依次向同一端点发出5个请求。在每个请求之间它会暂停两秒钟。该代码还输出从DNS检索到的Google服务器的IPv4地址。我们可以使用此IP地址来查看通过PowerShell中发出的netstat命令对其打开的连接netstat -ano | findstr 216.58.211 在我的例子中此命令的输出为TCP 192.168.1.139:53040 216.58.211.164:443 ESTABLISHED 20372 我们可以看到在这种情况下到远程端点的连接只有1个。在每个请求之后该连接将返回到池中因此在发出下一个请求时可以重新使用。如果我们更改连接的生存期以使它们在1秒后过期那么我们可以测试这对行为的影响using System;using System.Net;using System.Net.Http;using System.Threading.Tasks;namespace HttpConnectionPoolingSamples{class Program{static async Task Main(string[] args){var ips await Dns.GetHostAddressesAsync(www.google.com);foreach (var ipAddress in ips){Console.WriteLine(ipAddress.MapToIPv4().ToString());}var socketsHandler new SocketsHttpHandler{PooledConnectionLifetime TimeSpan.FromSeconds(1),PooledConnectionIdleTimeout TimeSpan.FromSeconds(1),MaxConnectionsPerServer 10};var client new HttpClient(socketsHandler);for (var i 0; i 5; i){_ await client.GetAsync(https://www.google.com);await Task.Delay(TimeSpan.FromSeconds(2));}Console.WriteLine(Press a key to exit...);Console.ReadKey();}}} TCP 192.168.1.139:53115 216.58.211.164:443 TIME_WAIT 0 TCP 192.168.1.139:53116 216.58.211.164:443 TIME_WAIT 0 TCP 192.168.1.139:53118 216.58.211.164:443 TIME_WAIT 0 TCP 192.168.1.139:53120 216.58.211.164:443 TIME_WAIT 0 TCP 192.168.1.139:53121 216.58.211.164:443 ESTABLISHED 25948 在这种情况下我们可以看到使用了五个连接。其中的前四个在1秒后从池中删除因此无法在下一个请求中重复使用。结果每个请求都打开了一个新连接。现在原始连接处于TIME_WAIT状态并且操作系统无法将其重新用于新的出站连接。最终连接显示为ESTABLISHED因为我在它过期之前就抓住了它。测试最大连接数对于下一个测试用例我们将使用以下程序using System;using System.Diagnostics;using System.Linq;using System.Net;using System.Net.Http;using System.Threading.Tasks;namespace HttpConnectionPoolingSamples{class Program{static async Task Main(string[] args){var ips await Dns.GetHostAddressesAsync(www.google.com);foreach (var ipAddress in ips){Console.WriteLine(ipAddress.MapToIPv4().ToString());}var socketsHandler new SocketsHttpHandler{PooledConnectionLifetime TimeSpan.FromSeconds(60),PooledConnectionIdleTimeout TimeSpan.FromMinutes(20),MaxConnectionsPerServer 2};var client new HttpClient(socketsHandler);var sw Stopwatch.StartNew();var tasks Enumerable.Range(0, 200).Select(i client.GetAsync(https://www.google.com));await Task.WhenAll(tasks);sw.Stop();Console.WriteLine(${sw.ElapsedMilliseconds}ms taken for 200 requests);Console.WriteLine(Press a key to exit...);Console.ReadKey();}}} 该代码将MaxConnectionsPerServer限制为2。然后启动200个任务每个任务都向同一端点发出HTTP请求。这些任务将同时运行。所有请求竞争所花费的时间将写入控制台。在我的机器上运行此命令后输出为 8013ms taken for 200 requests 如果使用netstat查看连接则根据定义的限制我们可以看到两个已建立的连接。已建立TCP 192.168.1.139:52780 216.58.204.36:443 ESTABLISHED 16076 TCP 192.168.1.139:52780 216.58.204.36:443 ESTABLISHED 16076 如果我们调整此代码以允许MaxConnectionsPerServer 10则可以重新运行该应用程序。这次所花费的时间减少了大约4倍。2123ms taken for 200 requests 当我们查看连接时我们可以看到确实建立了十个连接。TCP 192.168.1.139:52798 216.58.204.36:443 ESTABLISHED 30856 TCP 192.168.1.139:52799 216.58.204.36:443 ESTABLISHED 30856 TCP 192.168.1.139:52800 216.58.204.36:443 ESTABLISHED 30856 TCP 192.168.1.139:52801 216.58.204.36:443 ESTABLISHED 30856 TCP 192.168.1.139:52802 216.58.204.36:443 ESTABLISHED 30856 TCP 192.168.1.139:52803 216.58.204.36:443 ESTABLISHED 30856 TCP 192.168.1.139:52804 216.58.204.36:443 ESTABLISHED 30856 TCP 192.168.1.139:52805 216.58.204.36:443 ESTABLISHED 30856 TCP 192.168.1.139:52806 216.58.204.36:443 ESTABLISHED 30856 TCP 192.168.1.139:52807 216.58.204.36:443 ESTABLISHED 30856 结果提高了吞吐量。我们允许更多的出站连接因此可以更快地处理请求队列并通过额外的连接并行发出更多请求。我们还需要IHttpClientFactory吗这是一个非常合乎逻辑的问题可以作为这篇帖子的结论。IHttpClientFactory的功能之一是HttpMessageHandler链的生命周期管理因此也是基础连接的生命周期管理。有了HttpClient和SocketsHttpHandler可以达到相同效果的知识我们是否需要使用IHttpClientFactory我的观点是IHttpClientFactory除了帮助管理连接生存期外还有其他好处并且在发出出站HTTP请求时仍然可以增加价值。它提供了一种很好的模式可以使用命名或类型化的客户端方法[7]为HttpClient实例定义逻辑配置。类型化的客户端是我个人的最爱。这些逻辑客户端的流畅配置方法还使定制的DelegatingHandlers[8]与客户端的使用非常简单明了。这包括ASP.NET团队对该方法的扩展以便与Polly集成[9]以便轻松地对出站请求应用弹性和瞬时故障处理。即使没有生命周期管理我也希望在将来的一段时间内将工厂用于我的应用程序。根据我在网上看到的讨论很有可能在将来的版本中寿命管理功能将从IHttpClientFactory中弃用和/或删除因为它解决的问题不再适用。摘要在本文中我们看到自从.NET Core 2.1发布以来使用默认的SocketsHttpHandler实现时将维护连接池。使用池的设置我们可以控制连接的生存期并限制每个端点可能创建的出站连接的数量。我们还讨论了IHttpClientFactory不仅具有连接生存期管理的优点和功能因此仍然是一个有价值的工具。References[1] 本文来源: https://www.stevejgordon.co.uk/httpclient-connection-pooling-in-dotnet-core[2] www.stevejgordon.co.uk: http://www.stevejgordon.co.uk[3] Singleton HttpClient doesn’t respect DNS changes: https://github.com/dotnet/corefx/issues/11224[4] 系列博客文章: https://www.stevejgordon.co.uk/introduction-to-httpclientfactory-aspnetcore[5] www.github.com: http://www.github.com/[6] www.google.com: http://www.google.com/[7] 命名或类型化的客户端方法: https://www.stevejgordon.co.uk/httpclientfactory-named-typed-clients-aspnetcore[8] 定制的DelegatingHandlers: https://www.stevejgordon.co.uk/httpclientfactory-aspnetcore-outgoing-request-middleware-pipeline-delegatinghandlers[9] 与Polly集成: https://www.stevejgordon.co.uk/httpclientfactory-using-polly-for-transient-fault-handling【DotNET技术圈】致力于打造硬核、高质量的.NET技术公众号欢迎大家投稿。
http://www.sadfv.cn/news/89354/

相关文章:

  • 北京做微信网站医院网站建设运营方案
  • 电子专业毕设做网站厦门制作网页公司
  • 网站的物理结构佛山顺德网站建设公司哪家好
  • 南山网站公司小程序推广计划怎么赚钱
  • 百度推广整体优化网站三桥网站建设
  • 上海网站搭建西安工装装修公司排名
  • 建设银行网站公告岳阳公司网站制作
  • 深圳网站开发培训价格商业网站有什么作用
  • 做网站内容图片多大用jsp sqlserver做的购物网站
  • 做网站策划书建设游戏运营网站开展工作内容
  • 微信如何建网站关于推进公司网站开发的请示
  • 网站建设咨询问卷网站建设书店用户分几类
  • seo综合查询怎么进入网站扬州seo优化
  • iis6 建设网站浏览手机app定制开发多少钱
  • 预约网站如何自己做太原便宜做网站的公司哪家好
  • 凡科网免费网站域名注册平台戚里带崇墉
  • 婚礼网站怎么做网站建设新媒体运营
  • 触摸网站手机网页打不开百度网盘
  • php网站 configwordpress小工具编辑器
  • 微信怎么做自己的网站wordpress后台邓丽
  • 做啥类型网站xampp可以做网站吗
  • 网站制作步骤是什么wordpress初始设置
  • 网站大图轮播代码给wordpress添加图片不显示
  • 一小时做网站wordpress文章导入插件
  • 大连的网站制作公司黑马程序员python教程
  • 网站的维护和更新建设部注册师网站
  • 哪些客户需要做网站做任务免费得晋江币网站
  • 做网站对商家的好处列举免费域名注册的网站
  • 钟表玻璃东莞网站建设做网站买那种服务器
  • 快速学会做网站公司的网站如何进行修改布局