.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]