资料来源:ASP.NET Core合集 by微软系列技术教程www.bilibili.com/video/BV1Kk...
感谢老师的贡献!!!!
配合源码:
一、启动流程
1.1 创建项目
选择创建一个基于 .NET Core3.1 的 ASP .NET Core空Web程序:NetCoreDemo
1.2 项目主体结构
文件功能:
- appsettings.json 配置参数
- Program.cs 启动文件
- Startup.cs 配置用户注册关系
1.3 Main函数工作流程
配置kestrel服务器、IIS相关、其他配置------》启用用户配置的参数------》build、run运行WebHost主机。
具体见下图
1.4 项目启动流程总结
如上图,首先,浏览器发送一个请求给WebHost主机
------》主机监听到Http请求,走到用户配置的HTTP请求管道当中[webBuilder.UseStartup();]
------》进入startup.cs的Configure(),即HTTP请求处理管道当中
------》读取Configure()里配置项,比如遇到了输出代码(如awaitcontext.Response.WriteAsync("Hello World!");),请求处理管道会返回到浏览器,将"Hello World!"输出到页面
二、托管模型
2.1 两种托管模式
.NET Core Web应用程序的2种托管模式:
- 进程内 InProcess
- 进程外 OutOfProcess
新建应用程序默认使用InProcess来进行托管------》程序默认启动方式IIS Express
项目右键------》属性------》调试------》Web服务器设置
代码验证
为了验证进程内程序的运行状况------》在源码中自定义一个Startup模型Test,替换[webBuilder.UseStartup();]中的Startup,来输出当前进程的名称
(1)使用InProcess,启动编译程序,输出结果:ProcessName:iisexpress
InProcess:web程序托管在进程iisexpress.exe下,如下图。
(2)InProcess另一种可能:假如按下图选择第②种方式启动,即使用项目名称启动, 输出结果:ProcessName:NetCoreDemo
VS中两种启动方式:默认IISExpress启动,或项目Project启动
Project启动:web程序会托管在ASP .NET内部的服务器,我们称之为"kestrel服务器"下面。
2.2 IIS Express和IIS区别
iisexpress是针对开发人员优化的轻型独立IIS 版本。拥有 IIS 7 及更高版本的所有核心功能,供网站开发和测试使用,在实际生产中往往使用IIS。
官方文档参考:learn.microsoft.com/zh-cn/iis/e...
2.3 关于InProcess 和 OutOfProcess
InProcess 只使用一个服务器,要么iisexpress,要么是kestrel服务器
OutOfProcess 使用两个服务器,一个内部服务器(kestrel),一个外部服务器(如iis、nginx......)
二者性能区别:进程内 比 进程外 性能更好
因为进程外比进程内中间多了一个代理服务器(即外部服务器),通讯时需要中间服务器一一处理、转化,即导航请求,所以会产生一些性能损耗。
kestrel服务器:
ASP .NET Core是一个跨平台的服务框架, 支持在不同操作系统下开发和部署程序,kestrel服务器也是一个跨平台的web服务器,是跟随在ASP .NET Core下面,可以承载和运行开发者开发的web程序,进程名称就是运行的web应用程序名称
2.4 web应用程序启动方式
两种启动方式:
- visual studio项目内启动
- 打开cmd,用.net cli启动
如何使用cli启动?
打开cmd,首先cd定位到项目位置------》dotnetrun------》稍作等待
两个启动方式差别
使用.NET cli始终都是进程外托管,意味着有一个中间服务器(内部kestrel、外部IIS),会有一个转发过程。
输出的进程名称:ProcessName:NetCoreDemo,也是web项目名称
三、ASP .NET启动配置
本节梗概:启动方式不同,对托管模型进程内or进程外的影响等
3.1 启动配置文件
打开文件:launchSettings.json
文件内容如下:
- 当选用NETCoreDemo启动方式:运用配置③NetCoreDemo,启动kestrel服务器作为托管
- 当选用iisexpress启动方式:运用第配置②IIS Express,启动iisexpress作为托管
------》会查找iisexpress的一些配置,即"iisSetting"节点,随后找到应用程序地址"applicationUrl",最后就会用这个url作为项目启动地址(就是运行起来的localhost地址)
※ "iisSetting"节点,是用于iis设置的一些参数,以及iis服务器的地址(iisExpress------applicationUrl)
※"IIS Express"节点属性解析:(1)commandName
commandName允许 设置三个参数:IISExpress(IIS开发版本)、IIS(正式版本)、Project(项目名称)
(2)launchBrowser
应用程序启动时是否启动浏览器,默认true;
※菜单栏的运行方式下拉框和launchSettings.json是绑定的。比如将NETCoreDemo 改为Simple,下拉框中值会跟着改变
3.2 启动方式不同,托管模式有一些什么变化
如何指定托管模型(进程内or进程外)
- 方法1:项目右键------》属性------》调试------》web服务器设置------》托管模型
- 方法2:项目右键------》编辑项目文件
设计界面会打开文件如下图:
- 可通过添加节点AspNetCoreHostingModel来指定托管模型:
启动方式 + 托管模型不同,导致托管服务器产生差异, 对比情况如下------
- 第一种情况:启动方式Project;忽略托管模型参数------只一个内部服务器kestrel
- 第二种情况:启动方式IISExpress;托管模型为InProcess------只一个内部服务器IIS Express
- 第三种情况:IISExpress启动;OutOfProcess托管------内部Kestrel,外部IISExpress
- 第四种情况:IIS启动;InProcess托管------只一个服务器IIS
- 第五种情况:IIS启动;OutOfProcess托管------2个服务器
※归纳重点:使用进程外托管时,内部服务器都是Kestrel。
四、Startup类
本章重点:Startup类的作用
4.1 注册中间件等引用
代码位置:Program.cs------ConfigureHostBuilder()
类名默认是Startup,也可以自定义------参考演示项目NetCoreDemo中自定义 MyStartup 类
类中Configure()是必选方法,必须实现;
ConfigureServices()是可选方法;
(1)ConfigureServices :负责配置容器服务,定义NETCore当中注册的一些依赖关系 (2)Configure:负责注册中间件,配置HTTP请求处理管道当中一些配置(程序默认注册异常中间件、路由中间件、终结点中间件)
4.2 项目中另一个初始文件appsettings.json
该文件用于配置一些系统参数。如数据库链接、全局变量等
比如自定义变量
在其他位置调用自定义变量
4.3 在appsettings.json之下还有一个配置文件:appsettings.Development.json
该文件是开发者模式下的appsettings
和appsettings相比,二者默认访问数序是:develop >> appsetting。
※在环境变量launchSettings.json中也可以自定义变量。三者优先级为:launch >> develop >>appsetting。在实际开发过程中需要注意。
五、中间件
本章重点:ASP.NETCore中的核心中间件
5.1 什么是中间件
一些具备特定功能的组件(即我们所说的单一职责)
作用于http请求之前和之后,执行一些相应的工作:比如异常处理、日志记录、身份授权、记录请求、静态资源中间件等
5.2 .NETCore默认创建的三个中间件
- UseDeveloperExceptionPage:异常中间件。在开发者模式情况下会注册到请求处理管道当中
- UseRouting:路由中间件
- UseEndpoints:终结点中间件
5.3 如何引用中间件
可以通过"app.Use()","app.Run()"等扩展方法来配置
(1)app.use() 添加终结点中间件
即该中间件后面不会再有中间件了。
编译后页面显示如下:
(2)app.Use() 添加可以继续调用下一个中间件的中间件
调用方法:use方法中加一句 await next()
若不加上面这句,不会继续调用下一个中间件。即use()也变成了终结点中间件。
编译后页面显示如下: