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

购买网站平台如何做分录商务信息网

购买网站平台如何做分录,商务信息网,一键设计logo,黄冈网站建设哪家便宜在 C# 中#xff0c;平时我们在使用 HttpClient 的时候#xff0c;会将 HttpClient 包裹在 using 内部进行声明和初始化#xff0c;如#xff1a;using(var httpClient new HttpClient()){ }至于为什么#xff1f;无外乎是#xff1a;项目代码中就是这样写的#xf… 在 C# 中平时我们在使用 HttpClient 的时候会将 HttpClient 包裹在 using 内部进行声明和初始化如using(var httpClient new HttpClient()){ }至于为什么无外乎是项目代码中就是这样写的依葫芦画瓢/别人就是这样用的/在微软官方的 ASP.NET 教程中也是这么干的。说的技术范点当你使用继承了 IDisposable 接口的对象时建议在 using 代码块中声明和初始化当 using 代码段执行完成后会自动释放该对象而不需要手动进行显示 Dispose 操作。但这里HttpClient 这个对象有点特殊虽然继承了 IDisposable 接口但它是可以被共享的或者说可以被复用且线程安全。从项目经验来看倒是建议在整个应用的生命周期内复用 HttpClient 实例而不是每次 RPC 请求的时候就实例化一个。之前在优化公司一个 web 项目的时候也曾经因为 HttpClient 载过一次坑后面我会进行简述。我们先来用个简单的例子做下测试看为什么不要每次 RPC 请求都实例化一个 HttpClient public class Program { static void Main(string[] args) { HttpAsync(); Console.WriteLine(Hello World!); Console.Read(); } public static async void HttpAsync() { for (int i 0; i 10; i) { using (var client new HttpClient()) { var result await client.GetAsync(http://www.baidu.com); Console.WriteLine(${i}:{result.StatusCode}); } } } }运行项目输出结果后通过 netstate 查看下 TCP 连接情况虽然项目已经运行结束但是连接依然存在状态为 TIME_WAIT继续等待看是否还有延迟的包会传输过来。。默认在 windows 下TIME_WAIT 状态将会使系统将会保持该连接 240s。这里也就引出了我上面说的载过的一次坑在高并发的情况下连接来不及释放socket 被耗尽耗尽之后就会出现喜闻乐见的一个错误Unable to connect to the remote serverSystem.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.说白话就是会出现“各种套接字问题”。码WCF的童鞋可能更加记忆尤新问题追根溯源都是换汤不换药。熊厂里面能够搜索出来的解决方法基本都是“减少超时时间”但人为减少了超时时间会出现各种莫名其妙的错误。且无法避免服务器迟早崩溃的问题。可以通过注册表进行修改默认值[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay]那么如何处理这个问题答案已经在上面说了“复用 HttpClient”即可。如 public class Program { private static readonly HttpClient _client new HttpClient(); static void Main(string[] args) { HttpAsync(); Console.WriteLine(Hello World!); Console.Read(); } public static async void HttpAsync() { for (int i 0; i 10; i) { var result await _client.GetAsync(http://www.baidu.com); Console.WriteLine(${i}:{result.StatusCode}); } } }可以看到原先 10 个连接变成了 1 个连接。请不要在意两次示例的目标 IP 不同---SLB 导致的都是百度的ip另外因为复用了 HttpClient每次 RPC 请求的时候实际上还节约了创建通道的时间在性能压测的时候也是很明显的提升。曾经因为这一举动将 web 项目的 TPS 从单台 600 瞬间提升到了 2000页面请求时间也从 1-3s 减少至 100-300ms甚是让测试组小伙伴膜拜当然也包括了一些业务代码的细调。但知道个中缘由后一个小改动带来的项目性能提升。。。会让人上瘾至于如何创建一个静态 HttpClient 进行复用大家可以按项目实际来如直接创建一个“全局”静态对象或者通过各类 DI 框架来创建均可。但这么调整 HttpClient 的引用后依然存在一些问题可能会影响到你的项目尚未影响到我:P如因为是复用的 HttpClient那么一些公共的设置就没办法灵活的调整了如请求头的自定义。因为 HttpClient 请求每个 url 时会缓存该url对应的主机 ip从而会导致 DNS 更新失效TTL 失效了那么有没有办法解决 HttpClient 的这些个问题直到我遇到了 HttpClientFactory瞬间写代码幸福感倍升也感慨新时代的童鞋们真的太幸福了老一辈踩的坑可以“完美”规避掉了。HttpClientFactory 优势HttpClientFactory 是 ASP.NET CORE 2.1 中新增加的功能。“完美”解决了我多年来遇到的这些坑可以更加专注于业务代码。HttpClientFacotry 很高效可以最大程度上节省系统 socket。“JUST USE IT AND FXXK SHUT UP”:PFactory顾名思义 HttpClientFactory 就是 HttpClient 的工厂内部已经帮我们处理好了对 HttpClient 的管理不需要我们人工进行对象释放同时支持自定义请求头支持 DNS 更新等等等。从微软源码分析HttpClient 继承自 HttpMessageInvoker而 HttpMessageInvoker 实质就是HttpClientHandler。HttpClientFactory 创建的 HttpClient也即是 HttpClientHandler只是这些个 HttpClient 被放到了“池子”中工厂每次在 create 的时候会自动判断是新建还是复用。(默认生命周期为 2min)还理解不了的话可以参考 Task 和 Thread 的关系以前碰到 HttpClient 这个问题的时候就一直在想微软什么时候官方出一个 HttpClient 的 Factory虽然时隔了这么多年直到 .NET CORE 2.1 才出但也很是兴奋。借助 ASP.NET CORE MVC可以很方便的进行 HttpClient 的使用实战用法1常规用法统一在发布项目中声明和配置。1. 在 Startup.cs 中进行注册 public class Startup { public Startup(IConfiguration configuration) { Configuration configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddHttpClient(client_1,config { config.BaseAddress new Uri(http://client_1.com); config.DefaultRequestHeaders.Add(header_1,header_1); }); services.AddHttpClient(client_2,config { config.BaseAddress new Uri(http://client_2.com); config.DefaultRequestHeaders.Add(header_2,header_2); }); services.AddHttpClient(); services.AddMvc().AddFluentValidation(); } }2. 使用这里直接以 controller 为例其他地方自行 DI public class TestController : ControllerBase { private readonly IHttpClientFactory _httpClient; public TestController(IHttpClientFactory httpClient) { _httpClient httpClient; } public async TaskActionResult Test() { var client _httpClient.CreateClient(client_1); var result await client.GetStringAsync(/page1.html); var client2 _httpClient.CreateClient(); var result2 await client.GetStringAsync(http://www.site.com/XXX.html); return null; } }实战用法2使用自定义类执行 HttpClientFactory 请求1. 自定义 HttpClientFactory 请求类public class SampleClient{ public HttpClient Client { get; private set; } public SampleClient(HttpClient httpClient) { httpClient.BaseAddress new Uri(https://api.SampleClient.com/); httpClient.DefaultRequestHeaders.Add(Accept, application/json); httpClient.DefaultRequestHeaders.Add(User-Agent, HttpClientFactory-Sample); Client httpClient; }}2. 在 Startup.cs 中 ConfigureService 方法中注册 SampleClient代码如下services.AddHttpClientSampleClient();3. 调用public class ValuesController : Controller{ private readonly SampleClient _sampleClient;; public ValuesController(SampleClient sampleClient) { _sampleClient sampleClient; } [HttpGet] public async TaskActionResult Get() { string result await _sampleClient.client.GetStringAsync(/); return Ok(result); }}实战用法3完全封装 HttpClient 可以使用下面方法1. 自定义 HttpClientFactory 请求类public interface ISampleClient{ Taskstring GetData();} public class SampleClient : ISampleClient{ private readonly HttpClient _client; public SampleClient(HttpClient httpClient) { httpClient.BaseAddress new Uri(https://api.SampleClient.com/); httpClient.DefaultRequestHeaders.Add(Accept, application/json); httpClient.DefaultRequestHeaders.Add(User-Agent, HttpClientFactory-Sample); _client httpClient; } public async Taskstring GetData() { return await _client.GetStringAsync(/); }}2. 在 Startup.cs 中 ConfigureService 方法中注册 SampleClient代码如下services.AddHttpClientISampleClient, SampleClient();3. 调用public class ValuesController : Controller{ private readonly ISampleClient _sampleClient;; public ValuesController(ISampleClient sampleClient) { _sampleClient sampleClient; } [HttpGet] public async TaskActionResult Get() { string result await _sampleClient.GetData(); return Ok(result); }}
http://www.sadfv.cn/news/404381/

相关文章:

  • 绍兴网站制作建设西安网站建设管理
  • 网站怎么做友情链接wordpress 取一类文章
  • 简单网站制作步骤06年可以做相册视频的网站
  • 网站建设免费书合肥百度关键词优化
  • 建设一个公司网站需要什么条件编辑目录中的字体wordpress
  • 中国建设银行公积金网站首页北京网站制作公司哪家好
  • 和百度一样的网站北京设计制作公司
  • 国外素材网站英文网站seo 谷歌
  • 网站开发 介绍 回扣做民宿需要和多家网站合作吗
  • 瑞安营销网站建设宝坻网站建设制作
  • 贵州公司网站开发wordpress 删除主题作者
  • 厦门网站开发网站建设网站广州手机网站建设报价表
  • 服装网站 欣赏软件开发文档编制规范
  • 王晴儿 网站建设wordpress eaccelerator
  • 大理州城乡建设局网站免费的wordpress账号
  • 什么叫建网站程序开发外包
  • 如何做介绍监控公司的网站建设通官方网站
  • 中山做公司网站小程序制作服务器
  • 不限流量网站空间iis6添加网站
  • 佛山网站设计多少钱企业邮箱域名怎么填写
  • 西部数码网站模板知识产权代理
  • 小程序公众号网站建设房地产开发公司的简介
  • 商城网站开发哪家好海淀企业型网站建设
  • 网站开发资费做网站用注册公司吗
  • 华强方特网站开发关键字参数
  • 微信小程序制作网站在线制作ppt免费
  • 中山网站建设托管建设银行东四十条支行支行网站
  • 网站 搭建 亚洲服务器深圳燃气公司排名
  • 清远建设网站wordpress 容易被收录吗
  • 珠海微网站建设英文搜索网站