ASP.NET Core

news2024/11/26 8:32:57

1. 入口文件

  一个应用程序总有一个入口文件,是应用启动代码开始执行的地方,这里往往也会涉及到应用的各种配置。当我们接触到一个新框架的时候,可以从入口文件入手,了解入口文件,能够帮助我们更好地理解应用的相关配置以及应用的工作方式。

  .Net Core 应用的入口文件是 Program.cs,这里是应用启动的地方。在 .Net 6 之前的版本,Program.cs 文件是下面这样的,这是创建一个 Web 项目时的默认代码。

public class Program
{
	public static void Main(string[] args)
	{
		CreateHostBuilder(args).Build().Run();
	}

	public static IHostBuilder CreateHostBuilder(string[] args) =>
		Host.CreateDefaultBuilder(args)
			.ConfigureWebHostDefaults(webBuilder =>
			{
				webBuilder.UseStartup<Startup>();
			});
}

  其中 Main 方法就是应用启动的入口。可以看到在应用启动的时候,通过 建造者模式 创建了一个主机,并进行了相关的配置,最后将其运行起来。

  从代码中可以看到,在对主机进行配置的时候,使用到了 Startup 类,在 .Net 6 之前的版本,Startup 类承担应用的启动任务,是应用配置的主要地方。

2. Startup 类

2.1 Startup类结构

  Startup 类支持两种定义方式,一种是实现 IStartup 接口,一种是基于约定的。无论哪一种,Startup 类的基本结构都包含以下两个个关键函数。整体来说,基于约定的 Startup 类更加灵活。

  • ConfigureServices方法
  • Configure方法

2.1.2 ConfigureServices 方法

  • 该方法是可选的
  • 该方法用于添加服务到DI容器中
  • 该方法在 Configure 方法之前被调用
  • 基于约定的情况下,该方法要么无参数,要么只能有一个参数且类型必须为 IServiceCollection
  • 该方法内的代码大多是形如 Add{Service} 的扩展方法

2.1.3 Configure方法

  • 该方法是必须的
  • 该方法用于配置 HTTP 请求管道,通过向管道添加中间件,应用不同的响应方式。
  • 该方法在 ConfigureServices 方法之后被调用
  • 基于约定的情况下,该方法中的参数可以接受任何已注入到DI容器中的服务
  • 该方法内的代码大多是形如 Use{Middleware} 的扩展方法
  • 该方法内中间件的注册顺序与代码的书写顺序是一致的,先注册的先执行,后注册的后执行

  另外还有构造函数,当使用通用主机时,Startup 构造函数支持注入以下三种服务类型,在 Startup 类中全局进行使用:

  • IConfiguration
  • IWebHostEnvironment
  • IHostEnvironment

2.2 缺省Startup

  所谓缺省Startup,就是应用启动配置不用 Startup 类,直接在 ConfigureWebHostDefaults 中进行配置。

publicstaticIHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
          // ConfigureServices 可以调用多次,最终会将结果聚合
	  webBuilder.ConfigureServices(services =>
	  {
	  })
	  // Configure 如果调用多次,则只有最后一次生效.
	  .Configure(app =>
	  {
		// Configure调用之前,ConfigureServices已经调用,容器对象已经生成,所以这里可以通过容器直接解析需要的对象
		var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
          });
        });

2.3 多环境配置

  .NET Core 框架支持多环境开发,可以通过环境变量 ASPNETCORE_ENVIRONMENT 来设置应用当前的运行环境,以实现一套代码在不同环境下运行,根据环境区分一定的行为,支持开发、测试、预发布、生成环境下不同条件、不同配置的运行场景。

  我们可以直接在机器的环境变量中进行设置,在项目的 Properties 文件夹里面的“launchSettings.json”文件进行配置,该文件是用于配置VS中项目启动的,在 profiles 节点中通过不同的 json 对象配置当前应用的启动模式,而描述启动模式的 json 对象支持的字段中有一个 environmentVariables 节点,可以通过键值对方式配置环境变量。

  这里配置的环境变量只会在当前项目中起作用。若应用运行环境中从未对 ASPNETCORE_ENVIRONMENT 环境变量进行配置,则默认为 Production 。而我们其实可以将 ASPNETCORE_ENVIRONMENT 设置为任意值。

  之后,这些环境变量会在主机初始化的时候作为主机配置被加载到应用中,这些会在后面的配置系统中详细讲到。而在代码中,我们可以通过注入 IWebHostEnvironment 服务获取到当前应用的运行环境。例如下面在 StartUp 中通过判断环境执行不同的应用初始化逻辑。

  IWebHostEnvironment 服务中默认提供对 Development、Production、Staging 三种环境进行判断的扩展方法,如果是其他自定的环境,如 Test,可以使用 IsEnviroment() 方法进行判断。

  通过 IWebHostEnvironment 判断不同环境,从而在 StartUp 类中使用不同的初始化初始化逻辑,这种方式适合于不同环境下代码差异较少的情况。除此之外还有两种基于约定的方式,分别是 Startup 方法约定 和 StartUp 类名约定 。

  StartUp 方法约定具体是指 StartUp 类中 ConfigureServices 和 Configure 方法还可以按照Configure{EnvironmentName}Services和Configure{EnvironmentName}Services 这样的命名格式来写,通过命名约定的 {EnvironmentName} 部分区分不同环境,装载不同环境的代码。

  如果 StartUp 类中存在与当前环境名称匹配的 Configure{EnvironmentName}Services和Configure{EnvironmentName}Services 方法的话,则应用启动时会执行相应的方法中的逻辑,如果没有则执行原始的 ConfigureServices 和 Configure 方法中的逻辑。

  通过查看源码,可以看到当我们明确配置一个 Startup 类作为应用启动类的时候,会先判断是否是实现了 IStartup 接口。

  如果没有的话,则通过 StartupLoader 判断 Startup 类是否符合约定,最终构建出实现了 IStartup 接口的ConventionBasedStartup,并注入到容器中。这时候会结合环境变量,优先获取带有环境变量的方法,如果没有则使用没有带环境变量的方法。


 

  而 StartUp 类名约定和方法约定类似,程序启动时,会优先寻找当前环境命名符合Startup{EnvironmentName}的 Startup 类,如果找不到,则使用名称为Startup的类。类名约定的方式适用于多环境下,代码差异较大的情况。

  类名约定的方式下,在配置使用 UseStartUp 的时候需要一点小改动:

  查看源码,可以看到在我们调用上面的方法的时候,实际上并没有做具体的 Startup 类的构建操作,只是写入了两个设置,其实就是写入到了配置系统中,其中 WebHostDefaults.StartupAssemblyKey 是关键。

  之后在我们应用启动,调用Build方法时,在构建ASP.NET Core 基本服务的时候才会根据设置去构建启动类。

  在这里通过 StartupLoader 结合环境名称查找程序集中符合约定的 Startup 类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/578349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SOC与MCU的区别及汽车电子未来发展以及展望

SOC与MCU的区别及汽车电子未来发展以及展望 MCU与SOC的区别 CPU&#xff08;Central Processing Unit&#xff09;&#xff0c;是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可…

【PHP】问题已解决:宝塔面板搭建php网站无法上传图片或是文件(保姆级图文)

目录 问题情况原因和解决方法总结 『PHP』分享PHP环境配置到项目实战个人学习笔记。 欢迎关注 『PHP』 系列&#xff0c;持续更新中 欢迎关注 『PHP』 系列&#xff0c;持续更新中 问题情况 宝塔面板搭建php网站无法上传图片或是文件。 原因和解决方法 检查你的php里是否安装…

老板让你写个PPT没有头绪?没事,ChatGPT来帮你!

文章目录 前言一、先确定写什么——准备内容二、再看看能用吗——自动生成PPT三、最后再改改——看个人喜好写在最后 前言 自从人工智能横空而出&#xff0c;它在人们的生活中产生了巨大的影响。尤其在企业办公领域&#xff0c;借助人工智能的力量&#xff0c;能够迅速产出丰富…

千乎万唤始出来,支持gpt3和gpt4支持画图,的在线gpt应用接入案例开源上线啦

了解OPEN AI 平台用户一直在说&#xff0c;这个接口要怎么对接&#xff0c;如何在体验。 由于我一直忙于接口中台开发&#xff0c;所以在线基于OPEN AI 接口实例例子就一直没有写。现在终于写完了。 基于纯HTMLCSSJS 小白也能轻松上手部署。代码简单清晰。 这里不多做其他赘述…

tensorflow及其keras如何保存模型

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

如何从宏观层面构建优秀的大语言模型

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

高阶python | 装饰器

python版本&#xff1a;3.10.0 在学习装饰器前先了解一下闭包 阿-岳同学【python技巧060】形象理解闭包&#xff0c;玩转闭包 通过视频首先可以了解到主要的三个知识点 闭包是嵌套结构内层函数有调用外层函数的变量为闭包&#xff0c;同时内层函数是闭包函数&#xff08;所…

根据DataFrame1中指定列c1的每个值a1 从DataFrame2中指定列c2中的每个值a2 找到与a1最临近的值a2,进行所在行合并

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 根据DataFrame1中指定列c1的每个值a1 从DataFrame2中指定列c2中的每个值a2 找到与a1最临近的值a2,进行所在行合并 [太阳]选择题 关于以下代码说法错误的是&#xff1a; import pandas as pd…

新手应该如何快速上手MySQL数据库?

前言 数据库是计算机系统中用于存储、管理和检索数据的系统。它允许用户访问并管理数据&#xff0c;并具有可靠、可扩展和高效的特性。 文章目录 前言1. 数据库的相关概念1.1 数据1.2 数据库1.3 数据库管理系统1.4 数据库系统1.5 SQL 2. MySQL数据库2.1 MySQL安装2.2 MySQL配置…

我在CSDN的736个日子——两年纪念日“随想”

2021-05-21~2023-05-27&#xff0c;我在 CSDN 已有 736 个日子。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a;https:/…

设计一:51单片机流水灯控制

目录 一、设计内容 二、硬件电路分析 三、仿真原理图 四、程序设计 五、仿真结果 六、思考题 作者有话说 一、设计内容 本次设计使用4个按键&#xff0c;当KEY1按下时&#xff0c;P0口所接的发光二极管&#xff08;D1~D8&#xff09;以100ms的时间间隔自下至上循环点亮3…

软考A计划-试题模拟含答案解析-卷六

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

在线Excel绝配:SpreadJS 16.1.1+GcExcel 6.1.1 Crack

前端&#xff1a;SpreadJS 16.1.1 后端&#xff1a; GcExcel 6.1.1 全能 SpreadJS 16.1.1此版本的产品中包含以下功能和增强功能。 添加了各种输入掩码样式选项。 添加了在保护工作表时设置密码以及在取消保护时验证密码的支持。 增强了组合图以将其显示为仪表图。 添加了…

chatgpt赋能python:Python成为行业中的主力之一

Python成为行业中的主力之一 Python作为一种高级编程语言&#xff0c;已经成为了行业中的主力之一。Python的功能强大&#xff0c;易于学习和使用&#xff0c;而且兼容性良好。在数据科学&#xff0c;人工智能&#xff0c;web开发等领域&#xff0c;Python已经成为了不可或缺的…

chatgpt赋能python:Python转化为数字:Python程序员必须知道的关键技能

Python 转化为数字&#xff1a;Python 程序员必须知道的关键技能 Python 是一种广泛使用的编程语言&#xff0c;不仅适用于数据科学、人工智能和机器学习领域&#xff0c;还可以用于一般的应用开发。在 Python 中&#xff0c;数字是最基本的数据类型之一&#xff0c;因此了解如…

arm3399主板-使用ubuntu20.04搭建LVS-DR(netplan)

目录 一、规划 1、网络拓扑 2、检查 二、配置设备 1、配置LVS 1.配置IP转发 2.清除防火墙 3.安装ipvsadm工具 4.配置VIP 5.netplan与NetworkManager介绍 6.添加LVS规则 1.清除防火墙 2.添加伪装IP 3.安装web服务 4. 修改内核参数&#xff0c;防止IP冲突 3、配置w…

Golang每日一练(leetDay0079) 最大正方形、完全二叉树节点数

目录 221. 最大正方形 Maximal Square &#x1f31f;&#x1f31f; 222. 完全二叉树的节点个数 Count Complete Tree Nodes &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/…

ThingsBoard教程(五五):规则节点解析 REST接口调用 REST API Call Node,发送邮件Send Email Node

REST接口调用 REST API Call Nod Since TB Version 2.0 调用外部 REST 服务器的 REST API。 配置: 端点 URL 模式 - 可以是静态字符串,也可以是使用消息元数据属性解析的模式。例如 ${deviceType}。请求方法 - GET、POST、PUT、DELETE头 - 请求头,头或值可以是静态字符串…

chatgpt赋能python:Python转换为日期:完整解析

Python 转换为日期&#xff1a;完整解析 日期和时间是计算机编程中非常重要的一部分&#xff0c;可以用来记录和管理各种信息&#xff0c;例如日程安排、用户活动、数据更新等等。在 Python 中&#xff0c;我们可以使用 datetime 模块来轻松地进行日期和时间的操作和转换。 什…

JavaScript之DOM案例练习

1. 循环精灵图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" …