.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的代码管理使用思想, 所以建立了一 ...
随机推荐
- Inkscape 太慢
问题: 在画板上图像较多时, 会在粘贴 / 删除 时会陷入长时间的等待 解决: 最佳: Ubuntu上面的比windows上的快上几十倍, 测试比较, 感觉并不是Ubuntu上多用了GPU, 总之, ...
- tensorflow加载ckpt出错
Issue链接 问题: tensorflow加载ckpt出错 此处原因: 该ckpt文件对应的tensorflow版本过老, 其中的部分内置变量名发生了改变. 提示: Key lstm_o/bidir ...
- 动态规划算法 All In One
动态规划算法 All In One dynamic programming leetcode https://leetcode.com/tag/dynamic-programming/ https:/ ...
- postman 发送数组
原文 users[]:aa users[]:22 object[] // { users: [ { name: ' "ajanuw"', pwd: ' "aaa" ...
- .net core 和 WPF 开发升讯威在线客服系统:怎样实现拔网线也不丢消息的高可靠通信(附视频)
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...
- 深入浅出的JS执行机制(图文教程)
前序 作为一个有理想有抱负的前端攻城狮,想要走向人生巅峰,我们必须将我们使用的功法练到天人合一的地步.我在们日常工作中,使用最多的语言就是JavaScript了,为了写出完美的.能装逼的代码,我们必须 ...
- JVM必不可少的知识
1.Java垃圾回收机制 对象被判断为垃圾的标准:没有被其他对象引用 2.判断对象是否可被回收 (1)引用计数算法 判断对象的引用数量 通过判断对象的引用数量来决定对象是否可以被回收 每个对象实例都有 ...
- mbatis中的#{}和${}
#{}和${}的区别是什么?a.#{}是预编译处理,${}是字符串替换. b.Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set ...
- PyTorch 自定义数据集
准备数据 准备 COCO128 数据集,其是 COCO train2017 前 128 个数据.按 YOLOv5 组织的目录: $ tree ~/datasets/coco128 -L 2 /home ...
- JS判断对象是否包含某个属性
1.使用hasOwnProperty()判断 hasOwnProperty方法的参数就是要判断的属性名称,当对象的属性存在时返回true,否则返回false. var obj = { name:'ja ...