安静且高校一点就好7

2020/11/3

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文对异步编程的一个补充,HTTP协议的一个记录


提示:以下是本篇文章正文内容,下面案例可供参考

一、异步补充

1.异步中的异常处理

1.await 表达式也可以使用 try…catch…finally 结构。
代码如下(示例):

namespace 异步中的异常处理
{
    class Program
    {
        static void Main(string[] args)
        {
            Task t = DoExceptionAsync();
            t.Wait();
            Console.WriteLine($"{nameof(t.Status)}:{t.Status}");//任务状态标识,nameof作用接收元素,返回元素名称
            Console.WriteLine($"{nameof(t.IsCompleted)}:{t.IsCompleted}"); //任务是否完成状态标识
            Console.WriteLine($"{nameof(t.IsFaulted)}:{t.IsFaulted}");//任务是否有未处理的异常标识

            Console.ReadKey();
        }
        /// <summary>
        /// 异常操作
        /// </summary>
        /// <returns></returns>
        private static async Task DoExceptionAsync()
        {
            try
            {
                await Task.Run(()=> { throw new Exception(); });
            }
            catch (Exception)
            {

                Console.WriteLine($"{nameof(DoExceptionAsync)}出现异常!");
            }
        }
    }
}

在这里插入图片描述
 【分析】await 表达式位于 try 块中,按普通的方式处理异常。但是,为什么图中的状态(Status)、是否完成标识(IsCompleted)和是否失败标识(IsFaulted)分别显示:运行完成(RanToCompletion) 、已完成(True) 和 未失败(False) 呢?因为:任务没有被取消,并且异常都已经处理完成!
 show:从上述列子中反应, try…catch…finally 结构同样在异步编程中实现

二、HTTP简介

1.Http协议基础概念篇

HTTP简介:
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
HTTP是一个基于TCP/IP通信协议来传递数据。
Http工作原理:
1.HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
2.Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。
3.Web服务器根据接收到的请求后,向客户端发送响应信息。
4.HTTP默认端口号为80,但是你也可以改为8080或者其他端口。
Http三点注意事项:
1.HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
2.HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
3.HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
1.2在TCP/IP协议栈中的位置
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS(附图)
默认HTTP的端口号为80,HTTPS的端口号为443。
1.3HTTP的请求响应模型
HTTP协议永远都是客户端发起请求,服务器回送响应(附图)
这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系(就是他不会记住上一次客户端与服务器沟通内容)
1.4HTTP工作流程
一次HTTP操作称为一个事物,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

2.HTTP进阶篇

2.1.1建立连接方面:HTTP/1.0 每次请求都需要建立新的TCP连接,连接不能复用。HTTP/1.1 新的请求可以在上次请求建立的TCP连接之上发送,连接可以复用。优点是减少重复进行TCP三次握手的开销,提高效率。
注意:在同一个TCP连接中,新的请求需要等上次请求收到响应后,才能发送。
2.1.2请求方法:
GET请求指定的页面信息,并返回实体主体。
HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP /1.1 协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。
2.1.3Http消息结构
1.HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。
2.一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。
3.一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据
4.HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接
5.一旦建立连接后,数据消息就通过类似Internet邮件所使用的格式[RFC5322]和多用途Internet邮件扩展(MIME)[RFC2045]来传送。
2.1.4客户端请求消息与服务器响应消息
1.客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,
2.服务器HTTP的响应也是由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

2.1.5Http响应状态码:
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除400——错误请求,如语法错误
401——未授权
HTTP 401.1 - 未授权:登录失败
  HTTP 401.2 - 未授权:服务器配置问题导致登录失败
  HTTP 401.3 - ACL 禁止访问资源
  HTTP 401.4 - 未授权:授权被筛选器拒绝
HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败
402——保留有效ChargeTo头响应
403——禁止访问
HTTP 403.1 禁止访问:禁止可执行访问
  HTTP 403.2 - 禁止访问:禁止读访问
  HTTP 403.3 - 禁止访问:禁止写访问
  HTTP 403.4 - 禁止访问:要求 SSL
  HTTP 403.5 - 禁止访问:要求 SSL 128
  HTTP 403.6 - 禁止访问:IP 地址被拒绝
  HTTP 403.7 - 禁止访问:要求客户证书
  HTTP 403.8 - 禁止访问:禁止站点访问
  HTTP 403.9 - 禁止访问:连接的用户过多
  HTTP 403.10 - 禁止访问:配置无效
  HTTP 403.11 - 禁止访问:密码更改
  HTTP 403.12 - 禁止访问:映射器拒绝访问
  HTTP 403.13 - 禁止访问:客户证书已被吊销
  HTTP 403.15 - 禁止访问:客户访问许可过多
  HTTP 403.16 - 禁止访问:客户证书不可信或者无效
HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
404——没有发现文件、查询或URl
405——用户在Request-Line字段定义的方法不允许
406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。
HTTP 500 - 内部服务器错误
  HTTP 500.100 - 内部服务器错误 - ASP 错误
  HTTP 500-11 服务器关闭
  HTTP 500-12 应用程序重新启动
  HTTP 500-13 - 服务器太忙
  HTTP 500-14 - 应用程序无效
  HTTP 500-15 - 不允许请求 global.asa
  Error 501 - 未实现
HTTP 502 - 网关错误
2.1.6对于HTTP响应头信息,HTTP content-type查看文档,这里不做归纳。

三、Lambda表达式回顾

  1. “Lambda 表达式”(lambda expression)是一个匿名函数,可以表示为委托的代码,或者表示为表达式 树的代码,它所表示的表达式树可以编译为委托。 Lambda 表达式的特定委托类型取决于其参数和返回 值。不返回值的 Lambda 表达式对应于 Action 委托,具体取决于其参数数量。 返回值的 Lambda 表达式对应于 Func 委托,具体取决于其参数数量。
  2. Lambda 表达式广泛用于:
    将要执行的代码传递给异步方法,例如 Task.Run(Action)。
    编写 LINQ 查询表达式。
    创建表达式树。
  3. 从下面代码为我们可以看出c#一步步的升级,带给我们的是编程上的优美,简洁,可读性强,
    Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”具体形式:(input - parameters) => expression
    4.下列代码,我们由委托—>转变到Lambda表达式的过程:
    代码如下(示例):
namespace LambdaDemo
{
    delegate int CalculateHandler(int x, int y);
    class Program
    {
        static void Main(string[] args)
        {
            //“Lambda 表达式”(lambda expression)是一个匿名函数,可以表示为委托的代码,或者表示为表达式树的代码,它所表示的表达式树可以编译为委托。 Lambda 表达式的特定委托类型取决于其参数和返回值。不返回值的 Lambda 表达式对应于 Action 委托,具体取决于其参数数量。 返回值的 Lambda 表达式对应于 Func 委托,具体取决于其参数数量。
            //Lambda 表达式广泛用于:
            //将要执行的代码传递给异步方法,例如 Task.Run(Action)。
            //编写 LINQ 查询表达式。
            //创建表达式树。

            //接下来,我们由委托--->转变到Lambda表达式的过程

            //从下面代码为我们可以看出c#一步步的升级,带给我们的是编程上的优美,简洁,可读性强,
            //Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”具体形式:(input - parameters) => expression

            Test();


            Console.ReadKey();
        }
        static int Sum(int x, int y)
        {
            return x + y;
        }
        #region 委托的实现
        static void Test()
        {
            CalculateHandler sumHandler = new CalculateHandler(Sum);
            Console.WriteLine(sumHandler(1, 2).ToString());
        }
        #endregion
        #region 匿名方法的实现
        static void Test()
        {
            CalculateHandler sumHandler = delegate (int x, int y) { return x + y; };
            Console.WriteLine(sumHandler(1, 2).ToString());
        }
        #endregion
        #region Lambda表达式的实现
        static void Test()
        {
            CalculateHandler sumHandler = (x, y) => x + y;
            Console.WriteLine(sumHandler(1, 2).ToString());
        }
        #endregion

    }
}

5、Lambda表达式要点总结
1、Lambda表达式是一种表示匿名方法的更短的方法。

2、Lambda表达式语法:parameters =>正文表达式

3、Lambda表达式可以在()中具有零个或多个参数。

4、Lambda表达式可以在大括号{}中的正文表达式中有一条或多条语句

5、Lambda表达式可以分配给Func,Action或Predicate委托。

6、Lambda表达式可以以类似的方式调用委托。
二. 异步与Lambda表达式的初次接入
代码如下(示例):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace winformLambdaDemo
{
    public partial class Form1 : Form
    {
        //使用 async 修饰符可将方法、lambda 表达式或匿名方法指定为异步。
        public Form1()
        {
            InitializeComponent();
            button1.Click += async (sender, e) =>
              {
                  await ExampleMethodAsync();
                  textBox1.Text += "\r\nControl returned to Click event handler.\n";
              };
        }
        private async Task ExampleMethodAsync()
        {
            await Task.Delay(1000);//Task.Delay方法只会延缓异步方法中后续部分执行时间,当程序执行到await表达时,一方面会立即返回调用方法,执行调用方法中的剩余部分,这一部分程序的执行不会延长。另一方面根据Delay()方法中的参数,延时对异步方法中后续部分的执行。
        }
    }
}

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值