.NetCore 基础原理(上)

资料来源: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种托管模式

  1. 进程内 InProcess
  2. 进程外 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应用程序启动方式

两种启动方式:

  1. visual studio项目内启动
  2. 打开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来指定托管模型:

启动方式 + 托管模型不同,导致托管服务器产生差异, 对比情况如下------

  1. 第一种情况:启动方式Project;忽略托管模型参数------只一个内部服务器kestrel
  2. 第二种情况:启动方式IISExpress;托管模型为InProcess------只一个内部服务器IIS Express
  3. 第三种情况:IISExpress启动;OutOfProcess托管------内部Kestrel,外部IISExpress
  4. 第四种情况:IIS启动;InProcess托管------只一个服务器IIS
  5. 第五种情况: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中的核心中间件

参考资料:www.cnblogs.com/gxwang/p/16...

5.1 什么是中间件

一些具备特定功能的组件(即我们所说的单一职责)

作用于http请求之前和之后,执行一些相应的工作:比如异常处理、日志记录、身份授权、记录请求、静态资源中间件等

5.2 .NETCore默认创建的三个中间件

  1. UseDeveloperExceptionPage:异常中间件。在开发者模式情况下会注册到请求处理管道当中
  2. UseRouting:路由中间件
  3. UseEndpoints:终结点中间件

5.3 如何引用中间件

可以通过"app.Use()","app.Run()"等扩展方法来配置

(1)app.use() 添加终结点中间件

即该中间件后面不会再有中间件了。

编译后页面显示如下:

(2)app.Use() 添加可以继续调用下一个中间件的中间件

调用方法:use方法中加一句 await next()

若不加上面这句,不会继续调用下一个中间件。即use()也变成了终结点中间件。

编译后页面显示如下:

相关推荐
WineMonk6 小时前
.NET WPF CommunityToolkit.Mvvm框架
.net·wpf·mvvm
界面开发小八哥6 小时前
界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置
.net·wpf·界面控件·devexpress·ui开发
九鼎科技-Leo17 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo20 小时前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发20 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
九鼎科技-Leo1 天前
在 C# 中,ICollection 和 IList 接口有什么区别?
windows·c#·.net
时光追逐者1 天前
C#/.NET/.NET Core学习路线集合,学习不迷路!
开发语言·学习·c#·asp.net·.net·.netcore·微软技术
Crazy Struggle1 天前
.NET 全功能流媒体管理控制接口平台
.net·开源项目·流媒体
.net开发1 天前
WPF使用prism框架发布订阅实现消息提示
c#·.net·wpf