.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的代码管理使用思想, 所以建立了一 ...
随机推荐
- SQLite在C#的使用
SQLite在C#的使用 http://www.cnblogs.com/SharkBin/archive/2012/11/03/2752277.html System.Data.SQLite.DLL的 ...
- Loss_Function_of_Linear_Classifier_and_Optimization
Loss_Function_of_Linear_Classifier_and_Optimization Multiclass SVM Loss: Given an example(xi, yi& ...
- zsh terminal set infinity scroll height
zsh terminal set infinity scroll height zsh Terminal 开启无限滚动 https://stackoverflow.com/questions/2761 ...
- vscode & ignore .idea
vscode & ignore .idea settings.json .vscode & ignore .idea // 将设置放入此文件中以覆盖默认设置 { "files ...
- web effects collection
web effects collection typewriter effect js 打字机效果 http://www.mattboldt.com/demos/typed-js/ https://g ...
- CSS Layout All In One
CSS Layout All In One CSS2 position float % px , rem, em CSS3 flex grid multi column vw / vh 常见布局模式 ...
- NGK全球启动大会正式启动,资产上链的前景与机会在哪?
据彭博社报道,加州时间11月25日,NGK全球启动大会在美国硅谷圆满落幕,本次NGK全球启动大会为NGK全球化进程正式拉开了帷幕. 众多业界人士共襄盛举,共同进行探讨未来公链发展的去向和契机. 当前, ...
- 一文助你了解NGK商城
按照NGK的发展逻辑,将会在2021年上半年上线链商商城,解决传统消费行业真伪难辨的弊端,之后,将会推出小额支付功能,让NGK真正成为结算中的数字资产,目前两者落地性应用已经在开发内测阶段中,期初的部 ...
- 方案设计:基于IDEA插件开发和字节码插桩技术,实现研发交付质量自动分析
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 如何保证代码质量? 业务提需求,产品定方案,研发做实现,测试验流程.四种角色的相互配 ...
- 五分钟学会generator函数
什么是generator函数? 常规函数只会返回一个单一值(或者不返回任何值). 而 Generator 可以按需一个接一个地返回("yield")多个值.它们可与 iterabl ...