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

网站备案信息如何注销吗关键字排名优化工具

网站备案信息如何注销吗,关键字排名优化工具,外贸建站什么意思,网站规划书包括哪些内容一、前言在我们开发当中经常需要向特定URL地址发送Http请求操作#xff0c;在.net core 中对httpClient使用不当会造成灾难性的问题#xff0c;这篇文章主要来分享.net core中通过IHttpClientFactory 工厂来使用HttpClient的正确打开方式。二、HttpClient使用中的那些坑2.1 错… 一、前言在我们开发当中经常需要向特定URL地址发送Http请求操作在.net core 中对httpClient使用不当会造成灾难性的问题这篇文章主要来分享.net core中通过IHttpClientFactory 工厂来使用HttpClient的正确打开方式。二、HttpClient使用中的那些坑2.1 错误使用using(var client new HttpClient()) 我们可以先来做一个简单的测试代码如下 public async Taskstring GetBaiduListAsync(string url){var html ;for (var i 0; i 10; i){using (var client new System.Net.Http.HttpClient()){var resultawait client.GetStringAsync(url);html result;}}return html;} 运行项目输出结果后通过netstate查看下TCP连接情况虽然项目已经运行结束但是连接依然存在状态为 TIME_WAIT继续等待看是否还有延迟的包会传输过来默认在windows下TIME_WAIT状态将会使系统将会保持该连接 240s。在高并发的情况下连接来不及释放socket被耗尽耗尽之后就会出现喜闻乐见的一个错误错误原因:对象所占用资源应该确保及时被释放掉但是对于网络连接而言这是错误的,原因有如下网络连接是需要耗费一定时间的频繁开启与关闭连接性能会受影响开启网络连接时会占用底层socket资源但在HttpClient调用其本身的Dispose方法时并不能立刻释放该资源这意味着你的程序可能会因为耗尽连接资源而产生灾难性的问题。对于上面的错误原因大家可能会想到使用静态单例模式的HttpClient如下private static HttpClient Client new HttpClient(); 静态单例模式虽然可以解决上面问题但是会带来另外一个问题DNS变更会导致不能解析DNS不会重新加载需要重启才能变更有兴趣的大佬可以去尝试一下三、正确使用及源码分析HttpClientFactory 以模块化、可命名、可配置、弹性方式重建了 HttpClient 的使用方式由 DI 框架注入 IHttpClientFactory 工厂由工厂创建 HttpClient 并从内部的 Handler 池分配请求 Handler。.net core 2.1 开始引入了IHttpClientFactory 工厂类来自动管理IHttpClientFactory 类的创建和资源释放可以通过Ioc 注入方式进行使用代码如下services.AddControllers(); services.AddHttpClient(); 调用代码如下 private readonly IHttpClientFactory _clientFactory;public FirstController(IHttpClientFactory clientFactory) {_clientFactory clientFactory; }/// summary /// /// /summary /// param nameurl/param /// returns/returns public async Taskstring GetBaiduAsync(string url) {var client _clientFactory.CreateClient();var result await client.GetStringAsync(url);return result; } 代码中通过IHttpClientFactory 中的CreateClient()方法进行创建一个HttpClient 对象,但是没有看到有释放资源的动作那它是怎么释放的呢我们来看看它的主要源代码/// summary /// Creates a new see crefHttpClient/ using the default configuration. /// /summary /// param namefactoryThe see crefIHttpClientFactory/./param /// returnsAn see crefHttpClient/ configured using the default configuration./returns public static HttpClient CreateClient(this IHttpClientFactory factory) {if (factory null){throw new ArgumentNullException(nameof(factory));}return factory.CreateClient(Options.DefaultName); }public HttpClient CreateClient(string name) {if (name null){throw new ArgumentNullException(nameof(name));}var handler CreateHandler(name);var client new HttpClient(handler, disposeHandler: false);var options _optionsMonitor.Get(name);for (var i 0; i options.HttpClientActions.Count; i){options.HttpClientActions[i](client);}return client; }public HttpMessageHandler CreateHandler(string name) {if (name null){throw new ArgumentNullException(nameof(name));}var entry _activeHandlers.GetOrAdd(name, _entryFactory).Value;StartHandlerEntryTimer(entry);return entry.Handler; } 代码中可以看到创建HttpClent 时会先创建HttpMessageHandler对象,而CreateHandler 方法中调用了StartHandlerEntryTimer方法该方法主要时启动清理释放定时器方法核心代码如下 public DefaultHttpClientFactory(IServiceProvider services,IServiceScopeFactory scopeFactory,ILoggerFactory loggerFactory,IOptionsMonitorHttpClientFactoryOptions optionsMonitor,IEnumerableIHttpMessageHandlerBuilderFilter filters){if (services null){throw new ArgumentNullException(nameof(services));}if (scopeFactory null){throw new ArgumentNullException(nameof(scopeFactory));}if (loggerFactory null){throw new ArgumentNullException(nameof(loggerFactory));}if (optionsMonitor null){throw new ArgumentNullException(nameof(optionsMonitor));}if (filters null){throw new ArgumentNullException(nameof(filters));}_services services;_scopeFactory scopeFactory;_optionsMonitor optionsMonitor;_filters filters.ToArray();_logger loggerFactory.CreateLoggerDefaultHttpClientFactory();// case-sensitive because named options is._activeHandlers new ConcurrentDictionarystring, LazyActiveHandlerTrackingEntry(StringComparer.Ordinal);_entryFactory (name) {return new LazyActiveHandlerTrackingEntry(() {return CreateHandlerEntry(name);}, LazyThreadSafetyMode.ExecutionAndPublication);};_expiredHandlers new ConcurrentQueueExpiredHandlerTrackingEntry();_expiryCallback ExpiryTimer_Tick;_cleanupTimerLock new object();_cleanupActiveLock new object();}// Internal for testsinternal void ExpiryTimer_Tick(object state){var active (ActiveHandlerTrackingEntry)state;// The timer callback should be the only one removing from the active collection. If we cant find// our entry in the collection, then this is a bug.var removed _activeHandlers.TryRemove(active.Name, out var found);Debug.Assert(removed, Entry not found. We should always be able to remove the entry);Debug.Assert(object.ReferenceEquals(active, found.Value), Different entry found. The entry should not have been replaced);// At this point the handler is no longer active and will not be handed out to any new clients.// However we havent dropped our strong reference to the handler, so we cant yet determine if// there are still any other outstanding references (we know there is at least one).//// We use a different state object to track expired handlers. This allows any other thread that acquired// the active entry to use it without safety problems.var expired new ExpiredHandlerTrackingEntry(active);_expiredHandlers.Enqueue(expired);Log.HandlerExpired(_logger, active.Name, active.Lifetime);StartCleanupTimer();}// Internal so it can be overridden in testsinternal virtual void StartHandlerEntryTimer(ActiveHandlerTrackingEntry entry){entry.StartExpiryTimer(_expiryCallback);} 从微软源码分析HttpClient继承自HttpMessageInvoker而HttpMessageInvoker实质就是HttpClientHandler。HttpClientFactory 创建的HttpClient也即是HttpClientHandler只是这些个HttpClient被放到了“池子”中工厂每次在create的时候会自动判断是新建还是复用。(默认生命周期为2min)。希望这篇文章对你有帮助如果对你有帮助请点个推荐感谢!往期精彩回顾【.net core】电商平台升级之微服务架构应用实战.Net Core微服务架构技术栈的那些事.net core 基于Dapper 的分库分表开源框架core-dataAsp.Net Core 中IdentityServer4 授权中心之应用实战Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式Asp.Net Core 中IdentityServer4 授权流程及刷新TokenAsp.Net Core 中IdentityServer4 实战之 Claim详解Asp.Net Core 中IdentityServer4 实战之角色授权详解Asp.Net Core 中间件应用实战中你不知道的那些事Asp.Net Core Filter 深入浅出的那些事-AOPAsp.Net Core EndPoint 终结点路由工作原理解读ASP.NET CORE 内置的IOC解读及使用
http://www.huolong8.cn/news/15574/

相关文章:

  • 典型营销型网站有哪些网站建设金手指快速
  • 简洁的网站建设合同好网站建设公司昆明
  • 深圳企业专业网站设计盐城 网络推广
  • 沛县专业做网站企业邮箱是什么 怎么注册
  • 做艺术的网站dede制作的网站挂马
  • 科网站建设服务类网站免费建站
  • 软件工程师证书报考网站网络运营中心
  • 网站设计建设定制网页设计表格模板源代码
  • 学校信息化网站建设小型购物网站开发
  • 老河口网站建设南部县房产网
  • 做网站用什么配置的电脑云南推广
  • 网站开发小程序定制北京网站建设公司 蓝纤科技
  • 阿里云如何建立网站wordpress版08影院
  • 域名已有服务器也有怎么做网站岐山县住房和城市建设局网站
  • 做网站seo优化总结wordpress 图片cms主题
  • 建设电子商务网站需要什么设备wordpress文章无法中文
  • 医院网站建设iis7.5网站权限配置
  • php网站架设教程wordpress多用户编辑wiki
  • 深圳网站建设 外包合作wordpress代码乱吗
  • 手机wap网站制作需要多少钱常熟建设银行 招聘网站
  • wordpress做的网站吗网站制作的订单
  • 江门网站推广策划千锋教育前端培训
  • 响应式网站生成网页生成微信小程序
  • 青岛网站开发建设wordpress调用指定相关文章
  • 石家庄手机网站建设织梦网站背景音乐
  • 网站建设营销推广实训总结南宁上林网站建设
  • 爱搜索中级网站建设建设网站技术公司
  • 济南网站建设 济南货梯西安找工作哪个网站好
  • 做大型网站建设北京商场推荐
  • 安徽阜阳网站建设微信商城和网站建设