.NET6 WebAPI从基础到进阶--朝夕教育

打印 上一主题 下一主题

主题 992|帖子 992|积分 2976

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、环境准备

   1. Visual Studio 2022     2.   .NET6   平台支持     3. Internet Information Services  服务器(   IIS   )     4. Linux  服务器 【   CentOS   体系】  (  跨平台部署使用  )     5. Linux  服务器下的  Docker  容器(  Docker  部署使用)    2、上手NET6WebAPI

   1.   创建   .NET6 WebAPI   项目     2.   项目结构解读     3.   多种   API   定义     4.   多种启动方式  3    RESTful  风格      
   3.1 什么是 RESTful

   REST  全称是  Representational State Transfer  ,中文意思是表述性状态转移。     REST  自己并没有创造新的技术、组件或服务     REST  指的是一组架构约束条件和原则。     如果一个架构符合  REST  的约束条件和原则,我们就称它为   RESTful   架构。     理论上  REST  架构风格并不是绑定在  HTTP  上,只不外目前  HTTP  是唯一与  REST  相关的实例。 所以我们这     里描述的  REST  也是通过  HTTP  实现的  REST  。    3.2 RESTfull 重要规则是什么?

   3.2.1   资源与  URI  ,所有的资源都有一个资源标志符     Core WebApi  -   --  访问一块资源     
  3.2.2 统一资源接口

   
  3.2.3 资源的表述

   服务端可以通过  Content-Type  告诉客户端资源的表述形式。     资源的表述形式有:文本资源可以采用   html  、  xml  、  json   等格式,图片可以使用   PNG   或   JPG   展现出来    3.2.4 资源的链接

   dotnet run --  参数 在项目根目录下实行  -----  先编译  ---  再启动     dotnet xxx.dll --  参数 直接启动  dll   文件     https://localhost:7289/Company ----  代表  Company  的一块资源     https://localhost:7289/User ----  代表  User  的一块资源     幂等性:对同一  REST  接口的多次访问,得到的资源状态是相同的。     安全性:对该  REST  接口访问,不会使服务器端资源的状态发生改变。      传统  URL  哀求格式:     http://127.0.0.1/user/query/1 GET   根据用户  id  查询用户数据     http://127.0.0.1/user/save POST   新增用户     http://127.0.0.1/user/update POST   修改用户信息     http://127.0.0.1/user/delete GET/POST   删除用户信息      RESTful  哀求格式:     http://127.0.0.1/user/1 GET   根据用户  id  查询用户数据     http://127.0.0.1/user POST  新增用户     http://127.0.0.1/user PUT   修改用户信息     http://127.0.0.1/user DELETE   删除用户信息  很多人在设计   RESTful   架构时,使用很多时间来探求漂亮的  URI  ,而忽略了超媒体。所以,应该多花一     些时间来给资源的表述提供链接,而不是专注于  "  资源的  CRUD"  。     比如下一页的链接地点、资源的链接地点都应该符合   RESTful   的设计思绪。     差别的动作都可以有一个唯一的   URl   地点;    3.2.5 状态的转移

    原则上要求无状态通信原则。    4、多方式调用CoreAPI

   1.   浏览器访问  --  只能是  Get  哀求     2. swagger  访问     3.   后台模拟   Http   哀求访问  -----   HttpClient / HttpWebRequest     4.   Core WebAPI   返回效果中文乱码问题办理     5.   Ajax   哀求访问  --  异步哀求【背面解说  --  跨域哀求】   5Swagger配置

   1.   根本配置     项目创建之初:     2.   版本控制     3.   注释展示     4.   扩展  Token  值传入     5.   扩展文件上传按钮    6、路由解读

   源码项目:  Zhaoxi.NET6Demo.WebApi     源码案例:  AttributeRouteController   控制器    6.1 什么是路由?

   路由器  ----  转发网络信号     客户端在访问   API   时,   API   服务器接收到哀求之后,哀求的  URL  地点,来通过肯定的规则来进行匹配,     然后转发到确定的某一个   API   中,由某一个   API   来做业务处置处罚,这个转发的行为就是路由来完成,这个     匹配的规则就是路由规则。     6.2 特性路由Route

    在   Core WebAPI   中,每一个   API   必须指定特性路由,即在   API   或者控制器上标记     Route(“api/[Controller]/Api”)   ;访问   API   ,就按照这个格式访问;    6.3 RESTFul 约束,如果有多个GetPost...操作怎么办?

    在一个控制器中可以定义多个   API   方法     通过路由规则来区分    6.3 路由约束

   
   6.4 全局路由扩展

    如果在开辟中,需要把   API   的哀求地点来一个修改,按照目前的做法只能一个一个的修改;   7Swagger补充

   源码项目:  Zhaoxi.NET6Demo.WebApi     源码案例:  VersionControlController  控制器  +SwaggerExtension   类     1.   框架支持   API   版本控制     2. Swagger  支持   API   版本控制     3.   依照   RESTful   的多版本控制   7.1 框架支持 API 版本


8、内置IOC容器使用

    源码项目:  Zhaoxi.NET6Demo.WebApi     源码案例:  IOCContainerController  控制器      1.   分层架构,上层调用下层     2.   具备抽象【接口和抽象类】和实现【普通类】     3.   注册抽象和具体之间的关系     4.   通过构造函数注入【内置容器仅支持构造函数注入】   9API参数修饰特性

   源码项目:  Zhaoxi.NET6Demo.WebApi     源码案例:  ParameterFromController  控制器    9.1 FromServices

   表示来自于   IOC   容器创建     必然需要   IOC   容器先注册     如果没有标记   [FromServices]   ,默认会认定这个参数是要通过调用方通报      客户端向服务器发起哀求,组装一个固定格式的,符合  http  协议标准的数据格式;发给服务器;     以下几种特性,作用,就是明确指定,参数的数据是泉源于  Http  哀求的参数中,某一个渠道,可能是头 信息,body   ,表单;    9.2 FromBody

    api   搜集来自于客户端哀求的参数中,从  HTTP Body  中去搜集这个参数的数据,通常用于取   JSON,     XML   ,  网络到以后,绑定到当前的参数  /  对象中;      FromBody   修饰  -Get  哀求  ---  不能访问     FromBody   修饰  -Post  哀求  ---  可以访问     FromBody   修饰  -Put  哀求  ---  可以访问     FromBody   修饰  -Delete  哀求  ---  可以访问     哀求   API   ,客户端携带的参数为   JSON   格式。   content  -  type: application/json     9.3 FromForm

   api   搜集来自于客户端哀求的参数中,到  Form  表单中去搜集这个参数的数据,网络到以后,绑定到当 前的参数/  对象中;      FromForm   修饰  -Get  哀求  ---  不能访问     FromForm   修饰  -Post  哀求  ---  可以访问     FromForm   修饰  -Put  哀求  ---  可以访问     FromForm   修饰  -Delete  哀求  ---  可以访问    9.4 FromHeader

   api   搜集来自于客户端哀求的参数中,到  Header  头信息中去搜集这个参数的数据,网络到以后,绑定 到当前的参数/  对象中;      FromHeader   修饰  -Get  哀求  ---  可以访问     FromHeader   修饰  -Post  哀求  ---  可以访问     FromHeader   修饰  -Put  哀求  ---  可以访问     FromHeader   修饰  -Delete  哀求  ---  可以访问    9.5 FromQuery

    如果客户端通过查询字符串方式通报参数,   FromQuery   就是在   Url   地点中去获取值 api 搜集来自于客户端哀求的参数中,通过  URL Query  中去搜集这个参数的数据,网络到以后,绑定到 当前的参数/  对象中;      FromQuery   修饰  -Get  哀求     FromQuery   修饰  -Post  哀求     FromQuery   修饰  -Put  哀求     FromQuery   修饰  -Delete  哀求    9.6 FromRouteapi

    搜集来自于客户端哀求的参数中,在路由中去搜集这个参数的数据,网络到以后,绑定到当前的参     数  /  对象中;      FromRoute   修饰  --Get  哀求     FromRoute   修饰  --Post  哀求     FromRoute   修饰  --Put  哀求     FromRoute   修饰  --Delete  哀求    10、返回效果

   Zhaoxi.NET6Demo.WebApi     ReturnResultController    10.1 返回指定范例 (Specific type)

   返回指定范例,如果是对象、  int  ,默认会返回   Json   格式  ---  经过序列化处置处罚的;     如果是字符串:直接返回字符串;     最简单的   API   会返回原生的或者复杂的数据范例(比如,  string   或者自定义对象范例)。考虑如下的     Action  方法,其返回了一个自定义的  User  对象的集合      
  1. [HttpGet]
  2. [Route("GetStudentById/{id:int}")]
  3. public Student GetStudentById(int id) => new Student()
  4. {
  5. Id = 1,
  6. Age = 36,
  7. Name = "张三"
  8. };
  9. [HttpGet]
  10. [Route("GetStudentList")]
  11. public IEnumerable<Student> GetStudentList() => new List<Student>()
  12. {
  13. new Student()
  14. {
  15. Id = 1,
  16. Age = 36,
  17. Name = "张三"
  18. }, new Student()
  19. {
  20. Id = 1,
  21. Age = 36,
  22. Name = "李四"
  23. }
  24. };
  25. [HttpGet]
  26. [Route("GetAsyncUserList")]
  27. public async IAsyncEnumerable<Student> GetAsyncUserList([FromServices]
  28. IStudentService studentService)
  29. {
  30. var studentlist = studentService.GetUserListAsync();
  31. // 使用GetAuthorsAsync异步方法,不用authors查询完毕,就会进入下一步迭代返回
  32. authors
  33. await foreach (var student in studentlist)
  34. {
  35. yield return student;
  36. }
  37. }
复制代码
  10.2 返回 IActionResult 实例

    只要是实现了   IActionResult   的接口的,都可以作为返回值;     
  1. [Route("GetStudentJson")]
  2. [HttpGet]
  3. public IActionResult GetStudentJson()
  4. {
  5. //返回Json对象
  6. return new JsonResult(new Student()
  7. {
  8. Id = 1,
  9. Age = 36,
  10. Name = "张三"
  11. });
  12. 响应Nofound
  13. //return NotFound("No records");
  14. 响应Ok
  15. return Ok(); // 必须有Ok等方法包装
  16. }
复制代码

   10.3 返回 ActionResult<T> 实例

  1. [HttpGet]
  2. [Route("GetStudentNew")]
  3. public ActionResult<Student> GetStudentNew()
  4. {
  5. //返回Json对象
  6. return new Student()
  7. {
  8. Id = 1,
  9. Age = 36,
  10. Name = "张三"
  11. };
  12. }
复制代码
10.4 建议返回范例

WebApi 作为服务存在,需要和第三方对接;
最好能够约束一个标准;固定的返回数据的格式;
   固定格式   
  1. public class ApiResult<T> where T : class
  2. {
  3. /// <summary>
  4. /// Api执行是否成功
  5. /// </summary>
  6. public bool Success { get; set; }
  7. /// <summary>
  8. /// 错误消息
  9. /// </summary>
  10. public string? Message { get; set; }
  11. /// <summary>
  12. /// 结果集
  13. /// </summary>
  14. public T? Data { get; set; }
  15. }
复制代码

  11、日志纪录

   Zhaoxi.NET6Demo.WebApi     LoggingController      注意:不能允许没有任何监控的体系上线;     怎样监控  ---  日志纪录     需要日志信息的持久化  --  保存到文件中,保存到数据库中;    11.1 log4net 日志纪录

   支持文本日志,数据库日志     1  、   Nuget   引入程序包   log4net   +   Microsoft.Extensions.Logging.Log4Net.AspNetCore     2  、准备配置文件【设置为始终复制】     3  、植入   log4net     
    4  、注入  log  对象,写日志,写入   txt   文件    11.2 数据库日志

    要支持数据库纪录日志,日志信息写入到数据库中保存;     1  、修改配置文件,支持数据库     2  、   nuget   引入:写入数据库需要的程序集     3  、实行初始化数据库库脚本     11.2 Nlog 日志纪录

   1  、   nuget   引入:   NLog.Web.AspNetCore     2  、准备配置文件     3  、读取配置文件,植入   Nlog   

12Core WebAPI-Filter

  12.1 什么是 AOP ?

   AOP(Aspect Orient Programming)   ,面向切面编程  ,  作为面向对象编程的一种补充  ,  可以在不粉碎  之前的封装为基础动态增长一些功能;从而让体系更具备扩展性;      增长一个缓存功能     增长日志的功能     既希望不要违背开闭原则,也希望能够增长新的工能;     在之前的业务逻辑之前增长了逻辑;     在之前的业务逻辑之后增长了逻辑;     
   12.2 Core WebAPI 中的 AOP 支持有哪些?

   Zhaoxi.NET6Demo.WebApi     FiltersController      授权  ---   Authorize     资源  --   Resource     异常  --   Exception     方法前后  ---   Action     AlwayRunResult     效果前后  ---   Result     12.3 ResourceFilter 扩展定制

   a   定义类、实现   IResourceFilter   /   IAsyncIResourceFilter   接口,继承   Attribute   父类     b   实现方法     c   标记在   API   方法上      注意:只要是框架提供的是接口,抽象类;我们是不能直接使用的,需要通过扩展;    接口:实现接口,实现方法,把实现类植入;     抽象类:自定类来继承抽象类,覆写方法,把实现类注入;      CustomResourceFilterAttribute   特点:     使用   OnResourceExecuting   方法  +   OnResourceExecuted   方法 把要控制器构造函数的实行  +   API   调用 给包裹起来了;     12.4 ResourceFilter 扩展缓存

   ResouceFilter   的特点,得当什么场景应用呢?  ----   ResouceFilter   天生就是为了缓存而生的  。     缓存:就是一个暂时存储区域,以一个  Key-value  格式保存数据;      key---  保存数据的标识,也需要这个标识  key  才能获取缓存。      哀求来了  ---  在还没有做业务逻辑盘算之前  ---  判定缓存是否存在,如果存在,就直接返回缓存的值。     如果不存在,就应该去做盘算,盘算完毕,把效果保存到缓存中去;      缓存:如果缓存区域中的值没有变革,且  key  不变的,获取的值就应该是之前的值;     url   作为  key----   url   不变,缓存就应该不变;    12.5 ActionFilter 扩展定制

   a   定义类、实现或者实现   IActionFilter   /   IAsyncAction   /   ActionFilterAttribute   抽象类     b   实现方法  /  覆写方法     c   标记在   API   方法上      特点:     和   ResourceFilter   比力:     ResouceFilter   使用两个方法包裹了控制器的构造实例  +   API   实行;     ActionFilter   使用两个办法只包裹了   API   逻辑部分;    12.6 ActionFilter 场景应用

   ActionFilter   得当什么场景应用呢?  缓存?  ---  也可以扩展缓存;  为什么说   ResourceFilter   更得当做缓存?  ---   ResouceFilter   做缓存性能更高; 哀求处置处罚的环节会更     少,所以   ResouceFilter   更得当做缓存;     ActionFilter   究竟得当做什么呢?  ActionFilter   --  靠近   API   方法; 传入到   API   的参数,   API   实行     结束后,实行效果;都是   ActionFilter   开始获取到;纪录日志的时间;需要纪录下来;    12.7 ExceptionFilter 扩展

   专门用来统一进行异常的处置处罚;     异常处置处罚在开辟中,是一个必须要做的事儿  ~     a   定义类、实现或者实现   IExceptionFilter   /   IAsyncExceptionFilter   接口     b   实现方法     c   标记在   API   方法上     发生异常就会触发扩展类中的实现方法;    12.8 Filter的生效范围和依赖注入

   前面的  Filter  都是标记在方法上的,如果要大批量的生效怎么办呢?     1.   方法注册  ----  当火线法生效     2.   控制器注册  ---  控制器下所有方法生效     3.   全局注册  ---  全局生效     TypeFilter   和   ServiceFilter   的解读    12.9 ResultFilter/AlwaysRunResultFilter 特点总结

   a   定义类、实现或者实现接口     b   实现方法     c   标记在   API   方法上    13、鉴权授权

13.1 授权核心价值

   1  、保证数据安全,让差别的人做各自的事儿,让管理更便捷     2  、保证体系的安全      Http   协议: 多进程相互通信的一种协议标准,统一这个一个标准后,可以相互通信了;      1  、无状态      Sesssion/Cookes  授权     1.  把多个哀求和响应创建了联系;      
    13.2 JWT授权/token令牌授权

   通过一个令牌,验证这个令牌来确定权限;     https://jwt.io/     
  13.3 加密解密技术

   加密:  可以把一段明文  (  人类能够识别的信息  )=====  加密技术加密  ======  得到密文(人类无法识别的 信息);      解密:  可以把一段密文(人类无法识别的信息  ====  解密技术解密  ======  得到明文  (  人类能够识别的信 息)    13.4 可逆加密:

   可以加密也可以解密      对称可逆加密      有一个公开的加密解密算法  (  你知我知大家都知道  )  ,    有一个加密  key  和一个解密  key,    且两个  key  完全相 同;     加密算+  加密  key  可以加密。    解密算法  +  解密  key  可以解密;      非对称可逆加密      有一个公开的加密解密算法  (  你知我知大家都知道  )  ,有一个加密  key  和一个解密  key,   且两个  key  不相同,     且两个  key  是成对的,知道加密  key  无法推导出解密  key,  知道解密  key  也不能推导出加密  key;     加密  key+  加密算法  ---  加密  必须又解密算法  +   和加密  key  成套的解密  key  才能解密;     公钥私钥:     加密  key  做私钥,解密  key  做公钥;   13.5 鉴权授权脚色授权计谋授权

    脚色授权,客户端带上  token  来哀求   Api   ,   Api   要鉴权,要求脚色授权,在带上的  token  中,必须包含 Api授权指定的以为;      启用脚色授权      
     如果标记多个  Authorize  ,指定的脚色,是并且的关系;        脚色授权的场景:      场景一:如果要验证多个同时具备,同时具备多个  role,  就标记多个   Authorize  ,分别把脚色写上  ,  多个 脚色是并且的关系      
  1. [Authorize(AuthenticationSchemes= JwtBearerDefaults.AuthenticationScheme,Roles =
  2. "teacher")]
  3. [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles =
  4. "admin")]
  5. [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles =
  6. "student")]
复制代码
   场景二:多个脚色,只要有一个脚色匹配即可,多个脚色为或者的关系  ,  只需要标记一个  Authorize  特 性,roles="  脚色名称以逗号分割  "  ,逗号分割的脚色名称是或者的关系;      计谋:方式,定义多个计谋;      启用计谋      
    配置计谋生效     
  13.6 鉴权授权扩展Requirement


   token  是认证服务器颁发,  token  也没有被篡改;     如果我希望去调用第三方的服务来做一些数据验证呢?      Requirement  :还是基于计谋的授权,  Requirement  可以把验证逻辑给封装出来;      1  、定义  Requirement     2  、实现   IAuthorizationHandler   ---  直接使用   AuthorizationHandler<>   泛型类     3  、实现   IAuthorizationHandler   接口,     4  、使用  Requirement  ,实行的时间,通过  Requirement  找到   IAuthorizationHandler   的实现类,     AuthorizationHandler   实现类可以支持构造函数注入;     
    5  、标记生效     
    作用:把验证逻辑另外封装了,可以定义更多的验证逻辑;    14、发布部署


   1. Internet Information Services     2. Linux  体系部署     3. Docker  部署    14.1 Internet Information Services 部署

   1.   环境安装   
  1. 安装IIS
  2. 安装ASP.NET Core运行时环境:https://dotnet.microsoft.com/zh
  3. cn/download/dotnet/6.0
复制代码
   2.   发布项目     3.   部署    14.2 Linux体系发布 Core WebAPI

  
  1. Linux系统-CentOS7 ---基于虚拟机来安装
  2. IP:192.168.1.97
复制代码

  1. 安装教程
  2. 链接:https://pan.baidu.com/s/1gI93YwptrWdPKHBh5fLNqQ?pwd=6666
  3. 提取码:6666
复制代码

    我们的   Core WebAPI   应用程序是需要跑在   .NET Core   环境上面的。所以我们就需要先安装   .NET Core 环境。     根据微软官方的文档说明:如果要开辟   .NET   应用,请安装   SDK   (包括运行时)。 或者,如果只需运行 应用程序,请安装运行时。 如果要安装该运行时,建议安装 ASP.NET Core   运行时,因为它同时包括 .NET Core 和   ASP.NET Core   运行时。      命令实行:      1  、签名  密钥  添加到受信任密钥列表,并添加   Microsoft   包存储库      
  1. sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft
  2. prod.rpm
复制代码

    2  、查看可以安装的   dotnet   -  SDK   
  1. yum search dotnet-sdk
复制代码
   3  、安装得当的版本   
  1. sudo yum install dotnet-sdk-6.0.3.2
复制代码
   4  、查看安装的环境     
  1. dotnet --list-sdks
  2. dotnet --list-runtimes
复制代码
   5  、发布   Core WebAPI   项目  ,  上传到  Linux  服务器     6  、命令启动                  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表