笔记源于课堂编写:BiliBili
源视频教程:https://www.bilibili.com/video/BV1c441167KQ
第一课:创建项目(上)
1.DI的优点?
- 解耦,没有强依赖(利于单元测试)
- 不需要了解具体的服务类
- 也不需要管理服务类的生命周期
1-1生命周期(注册服务)
Transient:注册的服务在每次被请求的时候都会生成一个新的实例。
Scped:一次web请求产生一个实例,web请求处理完了生命周期就停止了。
Singleton:服务的实例一旦被创建,以后请求这个服务指指挥用这个实例。
第二课:创建项目(中)
1.端点(endpoint)
端点就是Http请求的url的结尾那部分,这部分会被中间件进行处理
/{controller}/{action}
/home/index
2.ASP.NET Core应用的多样性?
MVC:/home/index
Rezor Pages:/SomePage
SingaIR:Hub/Chat
第三课:创建项目(下)
1.包管理
服务器端(后端):Nuget
前端:Npm
第四课:建立列表和表单View
asp-controller:指定控制器
asp-action:指定action
asp-route-参数名:指定参数值
1.ASP.NET Core配置信息?
- Key-Value键值对
- 内存里、JSON、XML、INI等文件,或者系统环境变量
- 配置信息与配置系统是解构的
- 可以依赖注入
2.ASP.NET Core的配置信息源?
- appsettings.json
- appsettings.{Environment}.json
- Secret Manager
- 环境变量
- 命令行参数
第五课:View Component
1.View Component
为什么PartialView不行?因为没法添加业务逻辑;
如果在Controller里面写呢?那就无法复用
Child Action?开销太大,他也需要走完整个Controller的生命周期;
就像PartialView,但是还带有一个迷你的Controller,在这里也可以写业务逻辑。
可以使用Rezor语法来渲染View Component
第六课:Razor Page
1.MVC
Model:数据
View:HTML,Razor,TagHelpers
Controller:逻辑
2.Razor Page:(将3样东西放在一起)
数据
HTML,Razor,TagHelper
逻辑
3.Razor Page路由
(1)/Pages/Index.cshtml
/Index
(2)Pages/Department.cshtml
/Department
(3)Pages/Department/EmployeeList.cshtml
/Department/EmployeeList
(4)Pages/Depaertment/Index.cshtml
/Depaertment
/Depaertment/Index
第七课:SignaIR
1.什么是实时Web
**
2.SignaIR”底层”技术
而SignaIR使用了三种”底层”技术来实现实时web,分别是:
Long Polling
Server Sent Sent Event
Web Socket
3.Polling
Polling是实现实时web的一种笨方法,他就是通过定期的向服务器发送请求,来查看度武器的数据是否有变化。
如果服务器数据没有变化,那么久返回204No Content;如果有变化就把最新的数据发送给客户端;
这就是Polling;很简单,但是比较浪费资源
SiganIR没有采用Polling这种技术。
4.Long Polling
Long Polling和Polling有类似的地方,客户端都是发送请求到服务器,但是不同之处是:如果服务器没有新的数据要发给客户端的haul,那么服务器会继续保持连接,知道有新的数据产生,服务器才把新的数据返回给客户端。
如果请求发出后一段时间没有相应,那么请求就会超时,这是客户端会再次发出请求。
5.Server Sent Events(SSE)
使用SSE的话,web服务器可以在任何时间把数据发送到浏览器,可以称之为推送,而浏览器则会监听进来的信息,这些信息就像流数据一样,这个链接也会一直保持开放,直到服务器主动关闭它。
浏览器会使用一个叫做EventSource的对象用来处理传过来的信息。
6.Web Socket
Web Socket是不同于http的另一个TCP协议,他使得浏览器和服务器之间的交互式通信变的可能,使用WebSocket,消息可以从服务器发送到客户端,也可以从客户端发往服务器,并且没有像http那样的延迟,信息流没有完成的时候,TCP Socked通常是保持打开的状态。
使用现代浏览器是,SingaIR大部分情况下都会使用Web Socket,这也是最有效的传输方式。
全双工通信:客户端和服务器可以同时往对象发送消息。
并且不受SSE的那个浏览器连接数限制(6个),大部分浏览器对Socket链接数限制是(50个)
消息类型:可以是文本和二进制,Web Socket也支持流媒体(音频和视频)
其实正常的HTTP请求也使用了TCP Socket、Web Socket标准使用了握手机制吧用于HTTP的Socket升级为使用WS协议的WebSocket socker。
(1)Web Socket
7.HTTP握手
- 每一个WebSocket开始的时候都是一个简单的HTTP Socket
- 客户端首先发送一个Get请求到服务器,来请求升级Socket
- 如果服务器同意的话,这个Socket从这时开始就变成了WebSocket
8.消息类型
WebSocket的消息类型可以是文本、二进制,也包括控制类的信息:Ping/pong和关闭。
每个消息由一个或多个Frame组成。
9.SignaIR
SignaIR是一个.NET Core、.NET Framwork的开源实时框架。SignaIR可使用WebSocket、Server Sent Events和Long Polling作为底层传输方式。
SignaIR给予这三种技术构建,抽象与他们之上,他让你更好的关注业务而不是底层传输技术问题。
SignaIR这个框架分服务器和客户端,服务器支持ASP.NET Core和ASP.NET;而客户端出来支持浏览器里的JavsScript以外,也支持其他类型的客户端,例如桌面应用。
10.SignaIR回落机制
SignaIR使用的三种底层传输技术分别是WebSocket、Server Sent Events和Long Polliing。
其中Web Socket仅支持比较现代的浏览器,Web服务器也不能太老。
而Server Sent Events情况可能好一点,但是也存在同样的问题。
所以SignaIR采用回落机制,SignaLR有能力去协商支持的传输类型
11.PRC
PRC可以理解为像调用本地方法一样调用远程服务;
SignaIR采用RPC范式来进行客户端与服务端之间的通信;
SignaIR利用底层传输来让服务器可以调用客户端的方法,反之亦然,这些方法可以带参数,参数也可以是复杂对象,SignaIR负责序列号和反序列化。
12.Hub
Hub是SignaIR的一个组件,他运行在ASP.NET Core应用里,所以他是服务端的一个类。
Hub使用RPC接受从客户端发来的消息,也能把消息发给客户端,所以他就是一个通信的Hub。
在ASP.NET Core里,自己创建的Hub类需要继承与基类Hub。
在Hub类里面,我们就可以调用所有客户端上的方法了,同样客户端也可以调用Hub类里的方法。
SignaIR可以将参数序列号和反序列化,这些参数被序列化的格式叫做Hub协议,所以Hub协议就是用来序列化和反序列化的格式。
Hub协议的默认协议是JSON,还支持另外一个协议是MessagePack,MessagePack是二进制格式的。他比JSON更紧凑。而且处理起来更简单快速,因为他是二进制的。
此外,SignaIR也可以扩展使用其他协议.
第八课:Blazor简介
1.Blazor
基于Componnet的编程模型
2.Blazor宿主模型
客户端
服务器端
3.客户端模型
4.Mono
- 也是一个开源的.NET Framework
- 他可以解释IL
- 代码的IL是包含在.NET的 Assembly里面
- 浏览器之所以可以执行mono,是因为他接受到的mono版本是使用一种类似汇编(Aeesmbly)的低级语言编写的。而浏览器可以理解这种语言,他就是WebAssmbly
- 然后,Mono就会把你的Assembly里面的代码(包含着Cpmponents)解析成为WebAssembly。这样就可以在浏览器里面运行了。
5.客户关托管模型具有以下优点:
- 没有.NET服务器端依赖项。应用在下载到客户端之后完全正常运行。
- 工作服务器卸载到客户端。
- 不需要ASP.NET Core Web服务器来管理应用程序。无服务器不是方案的可能(例如:通过CND提供应用);
6.客户端托管的缺点:
- 应用程序限制为浏览器的功能。
- 需要支持的客户端硬件和软件(例如:Web Assembly支持)
- 下载大小较大,应用需要长时间加载。
- .Net运行时和工具支不太成熟。例如:.NET Standard支持中存在限制。
7.服务器端宿主模型
8.服务器端托管模型具有以下几个优点
- 下载大小明显小于客户端应用,且应用加载速度更快。
- 应用充分利用服务器功能,包括使用任何与.NET Core兼容的API
- 服务器上的.NET Core用于运行应用程序,。因此现有的.NET工具(如调试)可按照预期方式工作。
- 支持瘦客户端。
- 应用程序的.NET/C#代码库(包括应用程序的组件代码)不会提供给客户端。
9.服务器托管的缺点:
- 通常存在较高的延迟。
- 不支持脱机。
- 对于包含多个用户的应用程序而言,可伸缩非常困难。
- 不可能无服务器部署方案。
第九课:Web API
1.ApiController Attribute
- Attribute路由
- 对Model自动验证
- 推断绑定源
- [FromBody]:从请求的body来的(如果写了ApiController可以不写这个,可以自动推算出来)
- [FromFrom]:从表单提交
- [FromRoute]:路由有路由参数 {departmentId}
- [FromQuery]:QueryString中获取
- [FormHeader]:请求头中获取
- [FromServices]:从依赖服务中取出参数
第十课:gRPC——Protocol Buffer
1.为什么需要gRPC
- 现如今微服务很流行,而微服务很有可能是使用不同语言进行构造的,而微服务之间需要相互通信,所以微服务必须在以下方面达成共识
- 需要使用某种API
- 数据格式
- 错误的模式
- 现在最流行的一种API风格可能是REST,他主要是通过HTTP协议来传输JSON数据。
- 但是现在我们可以看看grpc,他来自Google,并且支持众多主流的语言,包括:Go,Dart,C#,C/C++,Node.js,Python等。
2.gRPC能解决那些问题?
- 构件(WEB)API是挺麻烦的,因为构件API时我们得考虑:
- 数据的格式是JSON/XML还是二进制的。
- 断电地址以及GET还是POST等
- 如何调用API以及异常的处理规则。
- API的效率:一次调用读取多少数据?是否太多或者太少了?太少的话可能会导致多次API调用?
- 延迟:
- 扩展性:是否能支持成千上万个客户端
- 负载均衡
- 与其他语言的互操作性
- 如何处理身份验证、监控、日志等。
3.什么是gRPC?
- gRPC来自Google,他是一个开源的框架;他同时也是Cloud Native Computoin基金会(CNCF)的一部分,就像Decker和Kubernetes一样。
- gRPC允许你为RPC(Remote Procedure Call)定义请求和相应,然后gRPC会帮你处理一切剩余的事情。
- 他的速度快,执行效率高,基于HTTP/2构件,低延迟,支持流,与开发语言无关,并且可以很简单的插入身份认证、负载均衡、日志和监控等功能。
4.什么是RPC?
- RPC是(Remote Procedure Call)远程过程调用。
- 在客户端代码使用gRPC调用的时候,就像直接调用了服务端的一个函数一样。
5.RPC是啥?
RPC他不是一个新的概念,很早他就出现了。但是他存在很多问题,而gRPC他是对PRC一种非常简洁的实现并且解决了很多RPC的问题。
6.如何学习gPRC?
- 首先,你得学习Protocal Buffer(简单来说,他可以用来定义消息和服务)
- 然后,你只需要实现服务即可,剩余的gRPC代码将会自动为你生成。
- .proto这个文件可以适用于十几种开发语言(包括服务端和客户端),并且他允许你使用同一个框架支持每秒百万级以上的RPC调用。
- gRPC使用的是合约优先的API开发模式,他默认使用Protocal buggers(protobuf)作为接口设计语言(IDL),这个.protp文件包括2部分:
- gRPC服务的定义
- 服务端和客户端之间传递的信息
7.为什么使用ProtocalBuffers
- 他和开发语言无关
- 可以生成所有主流开发语言的代码
- 数据是二进制格式的。串行话的效率高,Payload比较小
- 也很使用传递大量的数据
- 通过设定某些规格,使得API进化也很简单。
8.开发环境
第十一课:gRPC in ASP.NET Core 3x
1.gRPC
- Remote Procedure Call 远程过程调用
- 性能好
- Protocol Buffer,二进制的串行话格式,使用HTTP/2传输
- 支持全双工流
- 与语言和平台无关
- 约定为先的开发模式(.proto文件)
第十二课:部署
1..NET Core部署方式
- FDD:Framework-dependent
- SCD:Self-contained
2.FDD
- 优点:
- 无需配置服务器的操作系统
- 部署的包很小
- .NET Core是共享的
- 缺点:
- 只有在预先安装了.NET Core的情况下才能运行
- 可能会有兼容性的问题。
3.ECD
- 优点:
- 可以对你使用的.NET Core版本进行单独隔离的控制
- 应用程序100%可在目标系统运行
- 不同.NET Core版本的应用可无干扰共存并运行。
- 缺点:
- 需要配置目标服务器操作系统
- 部署包比较大