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

陕西网站开发公司哪家好如何设置wordpress博客摘要模式

陕西网站开发公司哪家好,如何设置wordpress博客摘要模式,幸运飞艇网站建设,有口碑的网站建设前言在之前的文章我们介绍过HttpClient相关的服务发现#xff0c;确实HttpClient是目前.NET Core进行Http网络编程的的主要手段。在之前的介绍中也看到了#xff0c;我们使用了一个很重要的抽象HttpMessageHandler#xff0c;接下来我们就探究一下HttpClient源码#xff0c… 前言    在之前的文章我们介绍过HttpClient相关的服务发现确实HttpClient是目前.NET Core进行Http网络编程的的主要手段。在之前的介绍中也看到了我们使用了一个很重要的抽象HttpMessageHandler接下来我们就探究一下HttpClient源码并找寻它和HttpMessageHandler的关系究竟是怎么样的。HttpClient源码解析    首先我们找到HttpClient源码的位置微软也提供了专门的网站可以查找.Net Core源码有兴趣的同学可以自行查阅。接下来我们查阅一下HttpClient的核心代码。首先我们可以看到HttpClient继承自HttpMessageInvoker这个类待会我们在探究这个类。public class HttpClient : HttpMessageInvoker { } 然后我们看下几个核心的构造函数public HttpClient(): this(new HttpClientHandler()) { }public HttpClient(HttpMessageHandler handler): this(handler, true) { }public HttpClient(HttpMessageHandler handler, bool disposeHandler): base(handler, disposeHandler) {_timeout s_defaultTimeout;_maxResponseContentBufferSize HttpContent.MaxBufferSize;_pendingRequestsCts new CancellationTokenSource(); } 通过这几个构造函数我们看出我们可以传递自定义的HttpMessageHandler。我们再看无参默认的构造其实也是实例化了HttpClientHandler传递给了自己的另一个构造函数我们之前讲解过HttpClientHandler是继承自了HttpMessageHandler通过最后一个构造函数可知最终HttpMessageHandler传给了父类HttpMessageInvoker。到了这里我们基本上就可以感受到HttpMessageHandler在HttpClient中存在的意义。    接下来我们从一个最简单而且最常用的方法为入口开始探索HttpClient的工作原理。这种方式可能是我们最常用而且最有效的的探索源码的方式了。个人建议没看过源码或者刚开始入门看源码的小伙伴们找源码的入口一定是你最有把握的的一个然后逐步深入了解。接下来我们选用HttpClient的GetAsync开始入手而且是只传递Url的那一个。public TaskHttpResponseMessage GetAsync(string? requestUri) {return GetAsync(CreateUri(requestUri)); }public TaskHttpResponseMessage GetAsync(Uri? requestUri) {return GetAsync(requestUri, defaultCompletionOption); } 通过这里我们可以大致了解到。其实大部分最简单的调用方式往往都是从最复杂的调用方式一步步的封装起来的只是系统帮我们初始化了一部分参数让我们按需使用。顺着方法一直向下找最后找到了这里。public TaskHttpResponseMessage GetAsync(Uri? requestUri, HttpCompletionOption completionOption,CancellationToken cancellationToken) {return SendAsync(CreateRequestMessage(HttpMethod.Get, requestUri), completionOption, cancellationToken); } 由此可以看出这里是所有GetAsync方法的执行入口我们通过查找SendAsync引用可以发现。不仅仅是GetAsync, PostAsyncPutAsyncDeleteAsync最终都是调用了这个方法。也就是说SendAsync是所有发送请求的真正执行者。接下来我们就查看SendAsync方法部分边角料代码我粘贴的时候将会做删减。public TaskHttpResponseMessage SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption,CancellationToken cancellationToken) {if (request null){throw new ArgumentNullException(nameof(request));}CheckDisposed();CheckRequestMessage(request);SetOperationStarted();//这里会把发送请求的HttpRequestMessage准备妥当PrepareRequestMessage(request);CancellationTokenSource cts;bool disposeCts;bool hasTimeout _timeout ! s_infiniteTimeout;long timeoutTime long.MaxValue;if (hasTimeout || cancellationToken.CanBeCanceled){disposeCts true;cts CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _pendingRequestsCts.Token);if (hasTimeout){timeoutTime Environment.TickCount64 (_timeout.Ticks / TimeSpan.TicksPerMillisecond);cts.CancelAfter(_timeout);}}else{disposeCts false;cts _pendingRequestsCts;}TaskHttpResponseMessage sendTask;try{//***这里是核心最终执行调用的地方sendTask base.SendAsync(request, cts.Token);}catch (Exception e){HandleFinishSendAsyncCleanup(cts, disposeCts);if (e is OperationCanceledException operationException TimeoutFired(cancellationToken, timeoutTime)){throw CreateTimeoutException(operationException);}throw;}//这里处理输出的唯一类型HttpResponseMessagereturn completionOption HttpCompletionOption.ResponseContentRead !string.Equals(request.Method.Method, HEAD, StringComparison.OrdinalIgnoreCase) ?FinishSendAsyncBuffered(sendTask, request, cts, disposeCts, cancellationToken, timeoutTime) :FinishSendAsyncUnbuffered(sendTask, request, cts, disposeCts, cancellationToken, timeoutTime); } 通过分析这段代码可以得知HttpClient类中最终执行的是父类的SendAsync的方法。看来是时候查看父类HttpMessageInvoker的源码了。HttpMessageInvoker源码解析public class HttpMessageInvoker : IDisposable {private volatile bool _disposed;private readonly bool _disposeHandler;private readonly HttpMessageHandler _handler;public HttpMessageInvoker(HttpMessageHandler handler): this(handler, true){}public HttpMessageInvoker(HttpMessageHandler handler, bool disposeHandler){if (NetEventSource.IsEnabled) NetEventSource.Enter(this, handler);if (handler null){throw new ArgumentNullException(nameof(handler));}if (NetEventSource.IsEnabled) NetEventSource.Associate(this, handler);_handler handler;_disposeHandler disposeHandler;if (NetEventSource.IsEnabled) NetEventSource.Exit(this);}public virtual TaskHttpResponseMessage SendAsync(HttpRequestMessage request,CancellationToken cancellationToken){if (request null){throw new ArgumentNullException(nameof(request));}CheckDisposed();if (NetEventSource.IsEnabled) NetEventSource.Enter(this, request);//***这里是HttpClient调用的本质其实发送请求的根本是HttpMessageHandler的SendAsyncTaskHttpResponseMessage task _handler.SendAsync(request, cancellationToken);if (NetEventSource.IsEnabled) NetEventSource.Exit(this, task);return task;}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (disposing !_disposed){_disposed true;if (_disposeHandler){_handler.Dispose();}}}private void CheckDisposed(){if (_disposed){throw new ObjectDisposedException(GetType().ToString());}} }是的你并没有看错整个HttpMessageInvoker就这么多代码而且还是靠子类初始化过来的基本属性。找到SendAsync方法这里基本上可以总结一点负责调用输入输出的类只有两个。一个是提供请求参数的HttpRequestMessage另一个是接收输出的HttpResponseMessage。这里也给我们日常工作编码中提供了一个很好的思路。针对具体某个功能的操作方法最好只保留一个其外围调用都是基于该方法的封装。然后我们找到了发送请求的地方_handler.SendAsync(request, cancellationToken)而handler正是我们通过HttpClient传递下来的HttpMessageHandler.由此可知HttpClient的本质是HttpMessageHandler的包装类。自定义HttpClient    探究到这里我们也差不多大概了解到HttpClient类的本质是什么了。其实到这里我们可以借助HttpMessageHandler的相关子类封装一个简单的Http请求类.接下来我将动手实现一个简单的Http请求类我们定义一个类叫MyHttpClient,实现代码如下public class MyHttpClient : IDisposable {private readonly MyHttpClientHandler _httpClientHandler;private readonly bool _disposeHandler;private volatile bool _disposed;public MyHttpClient():this(true){}public MyHttpClient(bool disposeHandler){_httpClientHandler new MyHttpClientHandler();_disposeHandler disposeHandler;}public TaskHttpResponseMessage GetAsync(string url){return GetAsync(new Uri(url));}public TaskHttpResponseMessage GetAsync(Uri uri){HttpRequestMessage httpRequest new HttpRequestMessage{Method HttpMethod.Get,RequestUri uri};return SendAsync(httpRequest,CancellationToken.None);}public TaskHttpResponseMessage PostAsync(string url, HttpContent content){return PostAsync(new Uri(url),content,null);}public TaskHttpResponseMessage PostAsync(Uri uri, HttpContent content,Dictionarystring,string headers){HttpRequestMessage httpRequest new HttpRequestMessage{Method HttpMethod.Post,RequestUri uri,Content content};if (headers ! null headers.Any()){foreach (var head in headers){httpRequest.Headers.Add(head.Key,head.Value);}}return SendAsync(httpRequest, CancellationToken.None);}private TaskHttpResponseMessage SendAsync(HttpRequestMessage httpRequest, CancellationToken cancellationToken){if (httpRequest.RequestUri null || string.IsNullOrWhiteSpace(httpRequest.RequestUri.OriginalString)){throw new ArgumentNullException(RequestUri);}return _httpClientHandler.SendRequestAsync(httpRequest, cancellationToken);}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (disposing !_disposed){_disposed true;if (_disposeHandler){_httpClientHandler.Dispose();}}} } 由于HttpMessageHandler的SendAsync是protected非子类无法直接调用所以我封装了一个MyHttpClientHandler继承自HttpClientHandler在MyHttpClient中调用具体实现如下public class MyHttpClientHandler : HttpClientHandler {public TaskHttpResponseMessage SendRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken){return this.SendAsync(request, cancellationToken);}protected override TaskHttpResponseMessage SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){return base.SendAsync(request, cancellationToken);} } 最后写了一段测试代码using (MyHttpClient httpClient new MyHttpClient()) {TaskHttpResponseMessage httpResponse httpClient.GetAsync(http://localhost:5000/Person/GetPerson?userId1);HttpResponseMessage responseMessage httpResponse.Result;if (responseMessage.StatusCode HttpStatusCode.OK){string content responseMessage.Content.ReadAsStringAsync().Result;if (!string.IsNullOrWhiteSpace(content)){System.Console.WriteLine(content);}} } 到这里自己实现MyHttpClient差不多到此结束了因为只是讲解大致思路所以方法封装的相对简单只是封装了Get和Post相关的方法。总结    通过本文分析HttpClient的源码我们大概知道了HttpClient本质还是HttpMessageHandler的包装类。最终的发送还是调用的HttpMessageHandler的SendAsync方法。最后我根据HttpClientHandler实现了一个MyHttpClient。以上只是本人理解如果处在理解不正确或者不恰当的地方望多多包涵同时也期望能指出理解不周的地方。我写文章的主要一部分是想把我的理解传递给大家欢迎大家多多交流。????欢迎扫码关注????
http://www.pierceye.com/news/971151/

相关文章:

  • 福州网站建设多少钱全网商城系统
  • 自己如何做团购网站在设计赚钱的网站
  • 支持wap网站的系统百度seo关键词排名查询
  • 做最好最全的命理网站郴州网络营销
  • wap网站技术怎么查询网站的建站时间
  • 深圳网站开发专业团队2o18江苏建设网站施工员模试卷
  • 网站购物建设实训心得体会中山皇冠建设开发有限公司网站
  • 做360pc网站排名首页学校网站建设工作计划
  • 网站设计与制作的基本步骤移动互联网论文
  • 建设部网站2015年第158号中国建筑材料网官网
  • 大理网站建设沛宣郑州模板建站代理
  • 新浪博客怎么上传wordpress佛山推广seo排名
  • 北京建设网站有哪些公司网络营销方法有哪几种
  • 在中国备案的网站服务器利用小说网站做本站优化
  • 网站风格的表现形式重庆观音桥房价
  • 哪些公司的网站做的很好手机网页素材
  • 天津地铁建设网站百度广告太多
  • 保定php网站制作wordpress的seo收件箱
  • 网站建设公司-跨界鱼科技优外国网站设计风格
  • 网站营销平台注册微信公众号流程
  • 西安专业网站建设服务公司商标查询网入口
  • 营销型网站设计房地产wordpress多媒体路径
  • 门户网站建设解决方案wordpress图片广告
  • 哈尔滨h5模板建站设计一个软件需要多少钱
  • 青岛网站建设方案服务惠民卡看电影怎么用
  • 兰州新站点seo加盟网站建设工作有底薪吗
  • 哈尔滨建设网站官网清远头条新闻
  • 泉州网站设计平台wordpress cenos
  • 网站内容批量替换站长之家网站素材
  • asp.net 获取网站域名展览馆展示设计