悠扬随风 发表于 2024-12-15 21:06:23

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

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风格    https://i-blog.csdnimg.cn/direct/b46f64a4d21844759c0c21497a35ee61.png   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-   --访问一块资源   https://i-blog.csdnimg.cn/direct/0a98cc4fcecf4d35ad5258145af6620c.png3.2.2 统一资源接口

   https://i-blog.csdnimg.cn/direct/b606ee413f5545c590e617b13bec7465.png3.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   哀求访问--异步哀求【背面解说--跨域哀求】   5、Swagger配置

   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//Api”)   ;访问   API   ,就按照这个格式访问;    6.3 RESTFul 约束,如果有多个Get、Post...操作怎么办?

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

    https://i-blog.csdnimg.cn/direct/31060e801e28443787b251b3530f6d66.png   6.4 全局路由扩展

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

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

https://i-blog.csdnimg.cn/direct/d0c230129b354306bbfd9b45d7bc855f.png
8、内置IOC容器使用

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

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

   表示来自于   IOC   容器创建   必然需要   IOC   容器先注册   如果没有标记      ,默认会认定这个参数是要通过调用方通报      客户端向服务器发起哀求,组装一个固定格式的,符合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对象的集合    

public Student GetStudentById(int id) => new Student()
{
Id = 1,
Age = 36,
Name = "张三"
};


public IEnumerable<Student> GetStudentList() => new List<Student>()
{
new Student()
{
Id = 1,
Age = 36,
Name = "张三"
}, new Student()
{
Id = 1,
Age = 36,
Name = "李四"
}
};


public async IAsyncEnumerable<Student> GetAsyncUserList(
IStudentService studentService)
{
var studentlist = studentService.GetUserListAsync();
// 使用GetAuthorsAsync异步方法,不用authors查询完毕,就会进入下一步迭代返回
authors
await foreach (var student in studentlist)
{
yield return student;
}
}   10.2 返回 IActionResult 实例

    只要是实现了   IActionResult   的接口的,都可以作为返回值;      

public IActionResult GetStudentJson()
{
//返回Json对象
return new JsonResult(new Student()
{
Id = 1,
Age = 36,
Name = "张三"
});
响应Nofound
//return NotFound("No records");
响应Ok
return Ok(); // 必须有Ok等方法包装
}
   10.3 返回 ActionResult<T> 实例



public ActionResult<Student> GetStudentNew()
{
//返回Json对象
return new Student()
{
Id = 1,
Age = 36,
Name = "张三"
};
} 10.4 建议返回范例

WebApi 作为服务存在,需要和第三方对接;
最好能够约束一个标准;固定的返回数据的格式;
   固定格式   public class ApiResult<T> where T : class
{
/// <summary>
/// Api执行是否成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 错误消息
/// </summary>
public string? Message { get; set; }
/// <summary>
/// 结果集
/// </summary>
public T? Data { get; set; }
}
11、日志纪录

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

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

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

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

12、Core WebAPI-Filter

12.1 什么是 AOP ?

   AOP(Aspect Orient Programming)   ,面向切面编程,作为面向对象编程的一种补充,可以在不粉碎之前的封装为基础动态增长一些功能;从而让体系更具备扩展性;    增长一个缓存功能   增长日志的功能   既希望不要违背开闭原则,也希望能够增长新的工能;   在之前的业务逻辑之前增长了逻辑;   在之前的业务逻辑之后增长了逻辑;   https://i-blog.csdnimg.cn/direct/6f055bcbd9574546aaa125c52f74d9b4.png   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.把多个哀求和响应创建了联系;      https://i-blog.csdnimg.cn/direct/d94c1d4bebfd44a8a05c31a4bb68e7fd.png    13.2 JWT授权/token令牌授权

   通过一个令牌,验证这个令牌来确定权限;   https://jwt.io/   https://i-blog.csdnimg.cn/direct/231509d80cbb4363a9e547d7f2d6d98e.png13.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授权指定的以为;      启用脚色授权      https://i-blog.csdnimg.cn/direct/62a5330d1ff0454d93b8617454c76b3b.png   如果标记多个Authorize,指定的脚色,是并且的关系;      脚色授权的场景:      场景一:如果要验证多个同时具备,同时具备多个role,就标记多个   Authorize,分别把脚色写上,多个 脚色是并且的关系    [Authorize(AuthenticationSchemes= JwtBearerDefaults.AuthenticationScheme,Roles =
"teacher")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles =
"admin")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles =
"student")]    场景二:多个脚色,只要有一个脚色匹配即可,多个脚色为或者的关系,只需要标记一个Authorize特 性,roles="脚色名称以逗号分割",逗号分割的脚色名称是或者的关系;      计谋:方式,定义多个计谋;      启用计谋      https://i-blog.csdnimg.cn/direct/03202e57e8564473ba351d5d633f960a.png    配置计谋生效   https://i-blog.csdnimg.cn/direct/0dc2bea006784c538d6031c1266687d5.png13.6 鉴权授权扩展Requirement


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


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

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

   Linux系统-CentOS7 ---基于虚拟机来安装
IP:192.168.1.97
安装教程
链接:https://pan.baidu.com/s/1gI93YwptrWdPKHBh5fLNqQ?pwd=6666
提取码:6666
    我们的   Core WebAPI   应用程序是需要跑在   .NET Core   环境上面的。所以我们就需要先安装   .NET Core 环境。   根据微软官方的文档说明:如果要开辟   .NET   应用,请安装   SDK   (包括运行时)。 或者,如果只需运行 应用程序,请安装运行时。 如果要安装该运行时,建议安装 ASP.NET Core   运行时,因为它同时包括 .NET Core 和   ASP.NET Core   运行时。      命令实行:      1、签名密钥添加到受信任密钥列表,并添加   Microsoft   包存储库    sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft
prod.rpm
    2、查看可以安装的   dotnet   -SDK   yum search dotnet-sdk    3、安装得当的版本    sudo yum install dotnet-sdk-6.0.3.2    4、查看安装的环境      dotnet --list-sdks
dotnet --list-runtimes    5、发布   Core WebAPI   项目,上传到Linux服务器   6、命令启动                  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: .NET6 WebAPI从基础到进阶--朝夕教育