c#进阶(6)—— 网络通信基础知识

1、HttpClient 类

(1)、HttpClient 类 用于发送HTTP 请求,接收请求的响应。

(2)、HttpClient 类 派生于 HttpMessageInvoker类,此基类负责执行 SendAsync(),SendAsync() 方法调用是异步的,可以编写一个完全异步的系统来调用Web服务。

2、实例

(1)、发出异步的Get 请求。

复制代码

namespace InternetCommunicate
{class Program{private const string baiduUrl = "http://www.baidu.com.cn";private const string googleUrl = "http://www.google.com";static void Main(string[] args){}/// <summary>/// 异步调用Get方法/// </summary>/// <returns></returns>public async Task GetDataSimpleAsync(){//实例化一个httpClient 对象,该对象是线程安全的,//client 对象可以处理多个请求,HttpClient 每个实例都维护自己的线程池,//HttpClient 实例之间的请求被隔离,调用Dispose方法释放资源。using (var client = new HttpClient()){//调用 GetAsync(),给他传递要调用的方法地址,把HTTP GET 请求发送给服务器,//GetAsync() 返回一个 HttpResponseMessage对象,包含//(1)、标题//(2)、状态//(3)、内容HttpResponseMessage response = await client.GetAsync(baiduUrl);//如果请求成功if(response.IsSuccessStatusCode){Console.WriteLine($"Response Status Code:{(int)response.StatusCode}" +$"{response.ReasonPhrase}");//通过ReadAsStringAsync方法,把返回的内容检索为一个字符串。string responseBodyAsText = await response.Content.ReadAsStringAsync();Console.WriteLine($"Received payLoad of {responseBodyAsText.Length} characters");Console.WriteLine(responseBodyAsText);Console.ReadLine();}}}}
}

复制代码

 (3)、传递httpheader(标题)

发出请求时,没有设置或改变任何标题,但HttpClient 的DefaultRequestHeaders 属性允许设置或改变标题,使用Add 方法可以给集合添加标题,设置标题和标题值后,会与HttpClient 实例发送的每个请求一起发送。

在本示例中,添加以json作为格式的标题值。代码如下:

复制代码

    /// <summary>/// 展示http 标题/// </summary>/// <param name="title"></param>/// <param name="httpHeaders"></param>public static void ShowHeaders(string title,HttpHeaders httpHeaders){foreach (var header in httpHeaders){string value = string.Join("  ", header.Value);Console.WriteLine($"Header:{header.Key} Value:{value}");}}/// <summary>/// 设置httpHeader 传递标题的信息/// </summary>/// <returns></returns>public async Task GetDataWithHeadersAsync(){try{using(var client = new HttpClient()){//添加作为json数据格式的标题值client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose");//DefaultRequestHeaders 获取与每个请求一起发送的值ShowHeaders("Request Headers:", client.DefaultRequestHeaders);//获取http 响应头的值HttpResponseMessage response = await client.GetAsync(googleUrl);ShowHeaders("Response Headers:", response.Headers);}}catch (Exception ex){throw ex;}}

复制代码

(4)、用HttpMessageHandler自定义请求

创建一个派生于HttpClientHandler的类,重写SendAsync()方法,该方法需要返回一个Task,对于错误的情况,不需要调用异步方法,只用Task.FromResult返回即可。

复制代码

public class SampleMessageHandler:HttpClientHandler{private string _message;public SampleMessageHandler(string message){_message = message;}protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken){if(_message == "error"){var response = new HttpResponseMessage(HttpStatusCode.BadRequest);return Task.FromResult<HttpResponseMessage>(response); }return base.SendAsync(request, cancellationToken);}}/// <summary>/// 用HttpMessageHandler自定义请求/// </summary>/// <returns></returns>public static async Task GetDataWithMessageHandlerAsync(){//如果消息是error,把响应的状态码设置为bad requestvar client = new HttpClient(new SampleMessageHandler("error"));HttpResponseMessage responseMessage = await client.GetAsync(googleUrl);//etc}

复制代码

(5)、使用SendAsync 创建HttpRequestMessage

使用SendAsync,可以对定义请求有更多的控制,重载HttpRequestMessage类的构造函数,传递HttpMethod的一个值,GetAsync方法用Get方式创建一个HTTP请求。

使用HttpMethod 不仅可以发送GET、POST、PUT和DELETE 请求,还可以发送HEAD、OPTIONS和Trace。

具体代码如下:

复制代码

        /// <summary>/// 使用SendAsync 创建HttpRequestMessage/// </summary>/// <returns></returns>private async Task GetDataAdvanceAsync(){using(var client = new HttpClient()){var request = new HttpRequestMessage(HttpMethod.Get, googleUrl);HttpResponseMessage response = await client.SendAsync(request);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】—— 学习云计算应用开发你需要掌握的五大技能

学习云计算应用开发之前&#xff0c;我们首先了解一下什么是云计算。 云计算百度百科&#xff1a;云计算&#xff08;cloud computing&#xff09;是分布式计算的一种&#xff0c;指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序&#xff0c;然后&#xff0c;…

c#进阶(5)—— WCF 实现简单预订功能

1、WCF概述 WCF全称为Windows Communication Foundation,在.Net 3.0 中引入&#xff0c;用于客户端与服务端通信&#xff0c;替换了之前的一些技术&#xff0c;如.Net Remoting 及 WSE。 WCF 相比ASP.NET Web API 复杂&#xff0c;但提供了更多的功能&#xff0c;如 &#x…

云原生架构重要组成部分之微服务

前言 近几年来&#xff0c;云计算与微服务架构非常火&#xff0c;运用广泛。各大厂商公司都运用了该技术架构&#xff0c;随着技术与理念的升级迭代&#xff0c;云原生概念应世而起&#xff0c;现在火的一塌糊涂。做为新时代的程序员&#xff0c;我们要抓住云原生的浪潮。 这篇…

第十届蓝桥杯——JAVA真题集锦

蓝桥杯百度百科&#xff1a; 蓝桥杯全国软件和信息技术专业人才大赛是由工业和信息化部人才交流中心举办的全国性IT学科赛事。共有北京大学、清华大学、上海交通大学等全国1200余所高校参赛&#xff0c;累计参赛人数超过40万人。2020年&#xff0c;蓝桥杯大赛被列入中国高等教育…

IIS与asp.net管道

阅读目录 asp.net是什么HTTP协议IIS与asp.netasp.net管道参考资料我们在基于asp.net开发web程序&#xff0c;基本上都是发布部署到安装了IIS的windows服务器上&#xff0c;然后只要用户能够访问就算任务完成了&#xff0c;但是很少静下心来想想这背后到底发生了什么&#xff0…

2022最新Spring相关大厂常问技术面试题大全 —— 金三银四好时机

Spring相关大厂常问面试题1. 什么是 Spring 框架?2. 列举一些重要的Spring模块&#xff1f;3. RestController 与 Controller 的区别4. 谈谈自己对于 Spring IoC 和 AOP 的理解5. Spring 中的 bean 的作用域有哪些?6. Spring 中的单例 bean 的线程安全问题了解吗7. Component…

C#进阶系列——AOP?AOP!

前言&#xff1a;今天大阅兵&#xff0c;可是苦逼的博主还得坐在电脑前写博客&#xff0c;为了弄清楚AOP&#xff0c;博主也是拼了。这篇打算写写AOP&#xff0c;说起AOP&#xff0c;其实博主接触这个概念也才几个月&#xff0c;了解后才知道&#xff0c;原来之前自己写的好多代…

SpringMVC大厂常问技术面试题大全 —— 金三银四进大厂

目录 ⭐你对SpringMVC框架的理解&#xff1f; ⭐SpringMVC主要组件&#xff1f; ⭐SpringMVC的执行流程以及各个组件的作用&#xff1f; ⭐SpringMVC支持的转发和重定向的写法&#xff1f; ⭐SpringMVC的常用注解&#xff1f; ⭐SpringMVC统一异常处理的思想和实现方式&a…

c#进阶(7)—— 异步编程基础(async 和 await 关键字)

async 和 await 关键字只是编译器功能&#xff0c;编译器会用Task类创建代码。 返 回值是一个Task&#xff0c;这种返回新线程的方法虽然可以提高系统的响应能力&#xff0c;但是多线程取值会给编码带来不便&#xff0c;所以新出的关键字await用于阻塞当前线程并 获取目标线程…

字节二面 —— 什么是同步锁、死锁、乐观锁、悲观锁

马上就要到金三银四佳季了&#xff0c;是找工作的好时候&#xff0c;小伙伴们一定要把握好时机&#xff0c;找到心仪的高薪工作。找工作就少不了面试&#xff0c;那我们从现在开始&#xff0c;多刷刷面试题&#xff0c;查缺补漏&#xff01;&#xff01;&#xff01; 目录 1. …

C#进阶之WebAPI(一)

最近出去面试&#xff0c;被问到关于WebAPI的知识&#xff0c;因为项目中没有单独写过WebAPI&#xff0c;使用的时候是和mvc结合在一起使用的&#xff0c;所以&#xff0c;在我的印象中WebAPI和mvc是差不多的&#xff0c;这种答案当然不能让人满意了&#xff0c;于是今天做个关…

【LeetCode-SQL每日一练】—— 620. 有趣的电影

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。大家可以叫我小梦~ 小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟数据库打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL知识储备是必不可少的…

改了一行代码,MySQL查询效率提升了80%,老板奖了我50万

⭐前言 优化MySQL数据库是数据库管理员必备的技能&#xff0c;通过不同的优化方式方法来达到提高MySQL数据库性能的目的。 MySQL数据库当用户和数据量非常少的情况下&#xff0c;我们就很难判断MySQL数据库性能的好坏。只有当用户量与数据量大起来&#xff0c;MySQL的性能如何才…

C#进阶之WebAPI(二)

今天学习一下&#xff1a;WebAPI如何使用呢&#xff1f; 首先我们打开vs新建一个WebAPI项目&#xff0c;可以看到一共有这些文件夹目录 首先了解一下这些文件夹/文件的意义&#xff08;按照程序启动的流程&#xff0c;相关的配置项就不说了&#xff09;&#xff0c; Global.as…

字节一面 —— List 和 Map、Set 的区别

马上就要到金三银四佳季了&#xff0c;是找工作的好时候&#xff0c;小伙伴们一定要把握好时机&#xff0c;找到心仪的高薪工作。找工作就少不了面试&#xff0c;那我们从现在开始&#xff0c;多刷刷面试题&#xff0c;查缺补漏&#xff01;&#xff01;&#xff01; 目录 ⭐常…

C#进阶之WebAPI(三)

今天复习一下WebAPI的路由知识&#xff1a; 首先分析一下MVC路由和WebAPI路由的区别&#xff1a; 在mvc里&#xff0c;默认的路由机制是通过URL路径去匹配控制器和Action方法的&#xff0c;在mvc中的默认路由定义在App_Start文件夹下的RouteConfig.cs文件下&#xff1a; publ…

阿里一面 —— HTTP中重定向和请求转发的区别?

马上就要到金三银四佳季了&#xff0c;是找工作的好时候&#xff0c;小伙伴们一定要把握好时机&#xff0c;找到心仪的高薪工作。找工作就少不了面试&#xff0c;那我们从现在开始&#xff0c;多刷刷面试题&#xff0c;查缺补漏&#xff01;&#xff01;&#xff01; 目录 ⭐T…

C#异步编程-------异步编程模型(APM)

术语解释&#xff1a; APM 异步编程模型&#xff0c; Asynchronous Programming Model EAP 基于事件的异步编程模式&#xff0c; Event-based Asynchronous Pattern TAP 基于任务的异步编程模式&#xff0c; Task-based Asynch…

【LeetCode-SQL每日一练】—— 627. 变更性别

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。大家可以叫我小梦~ 又到了练习SQL的时候啦&#xff01;一起来学习吧&#xff01; &#x1f64b;‍♂️ 小伙伴们如果在学习过程中有不明白的地方&#xff0c;欢迎评论区留言提问&#xff0c;小梦定知无…

iis运行原理 Asp.Net详解IIS内部运行原理

本章节主要讲IIS和 管道内部如何处理客户端Http请求&#xff0c;会较多的以代码的形式讲述&#xff0c;让大家对HttpApplication、HttpHandler、HttpApplicationFactory、Page这几个在处理请求过程中扮演重要角色的对象有更深入的了解。 下面我们通过单步调式跟踪System.Web.D…