ASP.NET Core 的三大基础点_asp.net core难吗
haoteby 2025-10-08 17:08 21 浏览
一、启动流程(WebHost / Generic Host)
- WebHost(针对 Web 应用)
- Program.cs 中创建并运行:
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); }
- CreateDefaultBuilder() 会完成:o 配置主机环境(IHostingEnvironment)、读取 appsettings.json、环境变量、命令行o 注册日志(Console、Debug、EventSource)o 配置 Kestrel、IIS 集成、静态文件支持
- 然后调用 Startup: o ConfigureServices(IServiceCollection services):注册依赖项 o Configure(IApplicationBuilder app, IHostingEnvironment env):定义中间件管道
- Generic Host(通用主机,.NET Core 3.0+ 推荐)
- 支持 Web、后台服务、Worker Service 等统一模型:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
- Host.CreateDefaultBuilder() 除了 WebHost 的默认外,还:o 注入 IHostedService、BackgroundService 运行机制o 提供统一的生命周期管理(StartAsync / StopAsync)o 支持配置、日志、多环境一致性
二、中间件(Middleware)注册与执行顺序
- 概念
- 中间件是实现 IMiddleware 或接收 RequestDelegate next 的组件,负责接收 HTTP 请求并可决定是否将请求传递给下一个中间件。
- 注册与“洋葱模型”
public void Configure(IApplicationBuilder app) { app.Use(async (ctx, next) => { Console.WriteLine("Middleware 1: before"); await next(); Console.WriteLine("Middleware 1: after"); }); app.Use(async (ctx, next) => { Console.WriteLine("Middleware 2: before"); await next(); Console.WriteLine("Middleware 2: after"); }); app.Run(async ctx => { Console.WriteLine("Terminal Middleware"); await ctx.Response.WriteAsync("Hello World"); }); }
执行顺序:
- 请求进来依次进入 Middleware 1 → Middleware 2 → Terminal
- 响应返回依次执行 Middleware 2 后逻辑 → Middleware 1 后逻辑
- 因此呈现“洋葱”结构:每个中间件在 await next() 前后各拦截一次。
- 控制顺序与短路
- Use 注册可多次调用 next(),可在前后插入逻辑
- Run 为终结中间件,不再调用后续 next(),可用于短路或专门处理
三、依赖注入(DI)容器原理与生命周期
- 原理概述
- ASP.NET Core 内置简单容器,通过 IServiceCollection 注册服务描述(ServiceDescriptor),并在运行时由 ServiceProvider 负责解析与实例化
- 支持构造函数注入、方法注入、属性注入(需手动)
- 生命周期三种模式
- Transient(瞬时,每次请求都创建新实例) o 注册:services.AddTransient();o 适用场景:轻量、无状态的服务;需保证每次使用都是全新实例
- Scoped(范围,每个 HTTP 请求内唯一实例) o 注册:services.AddScoped();o 适用场景:带状态但仅限单次请求的服务,如 EF Core 的 DbContexto 注意:在非 HTTP 场景下(Console、BackgroundService),需自行创建 scope:
using(var scope = serviceProvider.CreateScope()) { var svc = scope.ServiceProvider.GetRequiredService<IMyService>(); // ... }
- Singleton(单例,应用生命周期内唯一实例) o 注册:services.AddSingleton(); o 可传入已创建实例:services.AddSingleton(new MyService());o 适用场景:无状态或自主管理线程安全的服务,如缓存管理器、配置中心客户端
- 解析与释放
- ServiceProvider 在创建对象时会递归解析其依赖树,按需创建实例
- Dispose:实现 IDisposable 的 scoped 或 singleton 服务,会在 scope 或应用终止时自动调用 Dispose,有助于释放资源
- 注意事项
- 避免在 Singleton 中注入 Scoped(会导致 Captive Dependency 问题)
- 大对象或数据库连接宜采用 Scoped;短生命周期任务可用 Transient;全局配置和线程安全共享数据适合 Singleton
- 合理控制注册顺序与重复注册,后注册会覆盖同接口先前注册
以上三部分构成了 ASP.NET Core 最核心的启动、管道与依赖管理机制,建议结合自己项目中新建最小示例(Minimal API + Startup)来亲手调试体验每个阶段的执行流程和依赖注入效果。
相关推荐
- 如何为MySQL服务器和客户机启用SSL?
-
用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...
- k8s 证书问题排查_k8s dashboard 证书
-
从去年开始一些老项目上陆陆续续出现一些列的证书问题,(证书原理这里就不说了,官方文档一堆)多数刚开始的表现就是节点的kubelet服务起不来,节点状态NotReady表现日志如下failed...
- 企业级网络互通方案:云端OpenVPN+爱快路由器+Win11互联实战
-
企业级网络互通方案:OpenVPN搭建公有云+爱快路由器+Win11三地互联实战指南「安全高效」三地局域网秒变局域网实施环境说明...
- OpenV** Server/Client配置文件详解
-
Server配置详解...
- 接口基础认知:关键信息与合规前提
-
1.核心技术参数(必记)...
- S交换机通过SSH登录设备配置示例(RADIUS认证+本地认证独立)
-
说明:●本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。●通过不同的管理域来实现RADIUS认证与本地认证两种方式同时使用,两...
- SSL证书如何去除私钥密码保护_ssl证书怎么取消
-
有时候我们在生成证书的时候可以加入了密码保护。然后申请到证书安装到了web服务器。但是这样可能会带来麻烦。每次重启apache或者nginx的时候,都需要输入密码。那么SSL证书如何去除私钥密码保护。...
- SSL证书基础知识与自签名证书生成指南
-
一、证书文件类型解析...
- S交换机通过SSH登录设备配置示例(RADIUS认证)
-
说明:本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。假设已在RADIUS服务器上创建了用户名yc123,密码test#123。对...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- HTTPS TLS握手流程_进行tls握手
-
1.客户端向服务器发送`ClientHello`消息,包括支持的TLS版本、加密套件、随机数等信息。2.服务器收到`ClientHello`消息后,解析其中的信息,并根据配置选择一个加密套件。3....
- Spring Boot 单点登录(SSO)实现_spring boot 单点登录jwt
-
SpringBoot单点登录(SSO)实现全指南单点登录(SingleSign-On,SSO)是一种身份验证机制,允许用户使用一组凭证登录多个相关但独立的系统。在微服务架构和企业级系统中,SS...
- 源码分享:在pdf上加盖电子签章_pdf如何加盖电子公章
-
在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...
- 微信支付商户API证书到期 怎么更换
-
微信支付商户API证书到期更换是一个非常重要的操作,需要仔细按照流程进行。如果证书过期,所有通过API的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...