最近因为要调用webAPI功能,所以开始对目前基于.NET的相关访问手段进行分析,主要有HttpWebRequest,WebClient和HttpClient三种手段。
HttpWebRequest
这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制
请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。另一个好处是HttpWebRequest类不会阻塞UI线程。例如,当您从响应很慢的API服务器下载大文件时,您的应用程序的UI不会停止响应。HttpWebRequest通常和WebResponse一起使用,一个发送请求,一个获取数据。HttpWebRquest更为底层一些,能够对整个访问过程有个直观的认识,但同时也更加复杂一些。以GET请求为例,至少需要五行代码才能够实现。
-
HttpWebRequest http = (HttpWebRequest)WebRequest.Create("http://example.com");
-
WebResponse response = http.GetResponse();
-
Stream stream = response.GetResponseStream();
-
using (var streamtemn = File.Create("路径"))
-
{
-
stream.CopyTo(streamtemn);
-
}
这种方法是早期开发者使用的方法,在当前业务中已经很少使用,由于其更加底层,需要处理一些细节,最多可用于框架内部操作。
WebClient
WebClient
是一种更高级别的抽象,是HttpWebRequest
为了简化最常见任务而创建的,使用过程中你会发现他缺少基本的header,timeoust的设置,不过这些可以通过继承httpwebrequest来实现。相对来说,WebClient比WebRequest更加简单,它相当于封装了request和response方法,不过需要说明的是,Webclient和WebRequest继承的是不同类,两者在继承上没有任何关系。
使用WebClient
可能比HttpWebRequest
直接使用更慢(大约几毫秒),但却更为简单,减少了很多细节,代码量也比较少,比如下载文件的代码,只需要两行。
-
using (WebClient webClient = new WebClient())
-
{
-
webClient.DownloadFile("http://example.com", "路径");
-
}
WebClient主要面向了WEB网页场景,在模拟Web操作时使用较为方便,但用在RestFul场景下却比较麻烦,这时候就需要HttpClient出马了。
HttpClient
目前业务上使用的比较多的是HttpClient,它适合用于多次请求操作,一般设置好默认头部后,可以进行重复多次的请求,基本上用一个实例可以提交任何的HTTP请求。此外,HttpClient提供了异步支持,可以轻松配合async await 实现异步请求。
下表是三者一些区别
HttpWebRequset | WebClient | HttpClient | |
命名空间 | System.Net | System.Net | System.Net.Http |
继承类 | WebRequest | Component | HttpMessageInvoker |
支持url转向 | 是 | 否 | 是 |
支持cookie和session | 是 | 否 | 否 |
支持用户代理服务器 | 是 | 否 | 是 |
使用复杂度 | 高 | 低 | 低 |
实测 c# .net 中 httpwebrequest 和 httpclient 性能 区别 对比
以下是httpclient的代码
using (var http = new HttpClient())
{
//使用FormUrlEncodedContent做HttpContent
var content = new FormUrlEncodedContent(new Dictionary<string, string>()
{
{"token", steptoken},
{"id", steporderid},
{"driverId", stepdriverid}
});
s_totalwebrequest0++;
var response = await http.PostAsync("http://" + s_webapipro + "/denyOrder", content);
string res = await response.Content.ReadAsStringAsync();
s_totalwebrequest1++;
JObject obj = JObject.Parse(res);
}
以下是httpwebrequest的代码
string url = "http://" + GetWebApiPro() + "/denyOrder";
string postData = "token=" + steptoken + "&id=" + steporderid + "&driverId=" + stepdriverid;
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url));
webRequest.Method = "post";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength = byteArray.Length;
System.IO.Stream newStream = webRequest.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
string res = new
System.IO.StreamReader(response.GetResponseStream(),
Encoding.GetEncoding("utf-8")).ReadToEnd();
JObject obj = JObject.Parse(res);
httpwebrequest配合 如下 配置代码,将会提升客户端的并发能力
{
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2012-11-17 去除Office 2010的右键“共享文件夹同步”菜单
2009-11-17 asp.net程序优化技巧