.Net5下WebRequest、WebClient、HttpClient是否还存在使用争议?
WebRequest、WebClient、HttpClient 是C#中常用的三个Http请求的类,时不时也会有人发表对这三个类使用场景的总结,本人是HttpClient 一把梭,也没太关注它们的内部实现,最近比较闲就看了下它们内部实现到底有什么差别。
WebClient其实就是对WebRequest的二次封装,便于使用。所以主要看WebRequest和HttpClient之间的差别。WebRequest的默认实现是HttpWebRequest。我把其中关于今天主题关键的代码贴出来:
1 public override WebResponse GetResponse()
2 {
3 try
4 {
5 _sendRequestCts = new CancellationTokenSource();
6 return SendRequest(async: false).GetAwaiter().GetResult();
7 }
8 catch (Exception ex)
9 {
10 throw WebException.CreateCompatibleException(ex);
11 }
12 }
1 private async Task<WebResponse> SendRequest(bool async)
2 {
3 if (RequestSubmitted)
4 {
5 throw new InvalidOperationException(SR.net_reqsubmitted);
6 }
7
8 var request = new HttpRequestMessage(new HttpMethod(_originVerb), _requestUri);
9
10 bool disposeRequired = false;
11 HttpClient? client = null;
12 try
13 {
14 client = GetCachedOrCreateHttpClient(async, out disposeRequired);
15 if (_requestStream != null)
16 {
17 ArraySegment<byte> bytes = _requestStream.GetBuffer();
18 request.Content = new ByteArrayContent(bytes.Array!, bytes.Offset, bytes.Count);
19 }
20
21 if (_hostUri != null)
22 {
23 request.Headers.Host = Host;
24 }
25
26 // Copy the HttpWebRequest request headers from the WebHeaderCollection into HttpRequestMessage.Headers and
27 // HttpRequestMessage.Content.Headers.
28 foreach (string headerName in _webHeaderCollection)
29 {
30 // The System.Net.Http APIs require HttpRequestMessage headers to be properly divided between the request headers
31 // collection and the request content headers collection for all well-known header names. And custom headers
32 // are only allowed in the request headers collection and not in the request content headers collection.
33 if (IsWellKnownContentHeader(headerName))
34 {
35 if (request.Content == null)
36 {
37 // Create empty content so that we can send the entity-body header.
38 request.Content = new ByteArrayContent(Array.Empty<byte>());
39 }
40
41 request.Content.Headers.TryAddWithoutValidation(headerName, _webHeaderCollection[headerName!]);
42 }
43 else
44 {
45 request.Headers.TryAddWithoutValidation(headerName, _webHeaderCollection[headerName!]);
46 }
47 }
48
49 request.Headers.TransferEncodingChunked = SendChunked;
50
51 if (KeepAlive)
52 {
53 request.Headers.Connection.Add(HttpKnownHeaderNames.KeepAlive);
54 }
55 else
56 {
57 request.Headers.ConnectionClose = true;
58 }
59
60 request.Version = ProtocolVersion;
61
62 _sendRequestTask = async ?
63 client.SendAsync(request, _allowReadStreamBuffering ? HttpCompletionOption.ResponseContentRead : HttpCompletionOption.ResponseHeadersRead, _sendRequestCts!.Token) :
64 Task.FromResult(client.Send(request, _allowReadStreamBuffering ? HttpCompletionOption.ResponseContentRead : HttpCompletionOption.ResponseHeadersRead, _sendRequestCts!.Token));
65
66 HttpResponseMessage responseMessage = await _sendRequestTask.ConfigureAwait(false);
67
68 HttpWebResponse response = new HttpWebResponse(responseMessage, _requestUri, _cookieContainer);
69
70 int maxSuccessStatusCode = AllowAutoRedirect ? 299 : 399;
71 if ((int)response.StatusCode > maxSuccessStatusCode || (int)response.StatusCode < 200)
72 {
73 throw new WebException(
74 SR.Format(SR.net_servererror, (int)response.StatusCode, response.StatusDescription),
75 null,
76 WebExceptionStatus.ProtocolError,
77 response);
78 }
79
80 return response;
81 }
82 finally
83 {
84 if (disposeRequired)
85 {
86 client?.Dispose();
87 }
88 }
89 }
在SendRequest(bool async)方法中调用了一个方法GetCachedOrCreateHttpClient看到此处我一阵感慨,最终还是调用了HttpClient。到此也能粗显的看出来,三者在.Net5下,本质已经没有了区别,只是对外的表现形式不同而已,使用了时候不必太纠结内部实现优先不同,只关注自己喜欢怎么样的写法就行了。
.Net5下WebRequest、WebClient、HttpClient是否还存在使用争议?的更多相关文章
- 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)
一. 前言 前端调用有Form表单提交,ajax提交,ajax一般是用Jquery的简化写法,在这里不再过多介绍: 后端调用大约有这些:WebCient.WebRequest.Httpclient.W ...
- WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择
NETCore提供了三种不同类型用于生产的REST API: HttpWebRequest;WebClient;HttpClient,开源社区创建了另一个名为RestSharp的库.如此多的http库 ...
- .Net5 下Dictionary 为什么可以在foreach中Remove
在一个讨论群里,看见有人说Dictionary可以在foreach中直接调用Remove了,带着疑问,写了简单代码进行尝试 class Program { static void Main(strin ...
- webrequest HttpWebRequest webclient/HttpClient
webrequest(abstract类,不可直接用) <--- (继承)---- HttpWebRequest(更好的控制请求) <--- (继承)---- webclient (简单快 ...
- WebRequest/HttpWebRequest/HttpRequest/WebClient/HttpClient的区别
1.WebRequest和HttpWebRequest WebRequest 的命名空间是: System.Net ,它是HttpWebRequest的抽象父类(还有其他子类如FileWebReque ...
- C# WebClient,HttpClient,WebRequest
static void WebClientDemo() { string url = "https://www.cnblogs.com/Fred1987/p/11843418.html&qu ...
- 互联网的寒冬下各大一线互联网公司还在用SpringBoot这是为什么?
引言 现在各大技术社区 Spring Boot 的文章越来越多,Spring Boot 相关的图文.视频教程越来越多,使用 Spring Boot 的互联网公司也越来越多: Java 程序员现在出去面 ...
- C#: Create a WebRequest with HTTPClient
http://www.cnblogs.com/shanyou/archive/2012/03/21/2410739.html http://msdn.microsoft.com/zh-cn/libra ...
- ubuntu下30天自制操作系统还在继续学习中
操作系统还在学习中,进度不是非常确定,近期学习到了第13天的中部,由于把ucgui移植上去花了一点时间. 同一时候为了方便代码的兴许管理和分享,也为了学习github的代码管理使用思想, 所以建立了一 ...
随机推荐
- string logo(字符画),website,html5,css3,atom ide
1 <!DOCTYPE html> <!-- Powered by... _ _ ____. ______ ._______. _______ ___ ___ sssssssss \ ...
- TensorFlow & Machine Learning
TensorFlow & Machine Learning TensorFlow 实战 传统方式 规则 + 数据集 => 答案 无监督学习 机器学习 神经元网络 答案 + 数据集 =&g ...
- HTML script tag type all in one
HTML script tag type all in one script type https://developer.mozilla.org/en-US/docs/Web/HTML/Elemen ...
- VirtualBox All in One
VirtualBox All in One 虚拟机 / VM / Virtual Machine x86 and AMD64/Intel64 VirtualBox is a powerful x86 ...
- Chrome DevTools & Slow 3G Network
Chrome DevTools & Slow 3G Network shortcuts https://developers.google.com/web/tools/chrome-devto ...
- NGK项目好不好?
在谈NGK项目之前,我们不得不提到NGK背后的研发团队,硅谷顶尖技术团队灵石团队.硅谷作为全世界最顶尖的高新技术和科技创新产业区,NGK.IO区块链系统正是在此处诞生. 灵石部门核心成员曾负责过多个P ...
- spring-ioc心得
1.创建spring容器,严格的来说就是创建ClassPathXmlApplicationContext对象, 该对象属于ApplicationContext类型(是一个接口)该接口下有很多实现类, ...
- 处理XML数据应用实践
摘要:GaussDB(DWS)支持XML数据类型及丰富的XML解析函数,可实现关系数据和XML数据的映射管理功能. XML概述 XML是可扩展的标识语言(eXtensible Markup Langu ...
- MySQL如何搭建主库从库(Docker)
目录 MySQL主从搭建 一.主从配置原理 二.操作步骤 1.创建主库和从库容器 2.启动主从库容器 3.远程连接并操作主从库 4.测试主从同步 MySQL主从搭建 一.主从配置原理 mysql主从配 ...
- 使用Tomcat30分钟搭建个人服务器
目录 一.服务器简介 二.安装教程 三.出现的问题 一.服务器简介 Tomcat服务器是一个Apache软件资金会的开源项目,实现了Servlet,JSP,EL,WebSocket协议. 二.安装教程 ...