百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

ASP.NET Core 的三大基础点_asp.net core难吗

haoteby 2025-10-08 17:08 21 浏览

一、启动流程(WebHost / Generic Host)

  1. 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):定义中间件管道
  1. 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)注册与执行顺序

  1. 概念
    • 中间件是实现 IMiddleware 或接收 RequestDelegate next 的组件,负责接收 HTTP 请求并可决定是否将请求传递给下一个中间件。
  1. 注册与“洋葱模型”
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() 前后各拦截一次。
  1. 控制顺序与短路
    • Use 注册可多次调用 next(),可在前后插入逻辑
    • Run 为终结中间件,不再调用后续 next(),可用于短路或专门处理

三、依赖注入(DI)容器原理与生命周期

  1. 原理概述
    • ASP.NET Core 内置简单容器,通过 IServiceCollection 注册服务描述(ServiceDescriptor),并在运行时由 ServiceProvider 负责解析与实例化
    • 支持构造函数注入、方法注入、属性注入(需手动)
  1. 生命周期三种模式
    • 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 适用场景:无状态或自主管理线程安全的服务,如缓存管理器、配置中心客户端
  1. 解析与释放
    • ServiceProvider 在创建对象时会递归解析其依赖树,按需创建实例
    • Dispose:实现 IDisposable 的 scoped 或 singleton 服务,会在 scope 或应用终止时自动调用 Dispose,有助于释放资源
  1. 注意事项
    • 避免在 Singleton 中注入 Scoped(会导致 Captive Dependency 问题)
    • 大对象或数据库连接宜采用 Scoped;短生命周期任务可用 Transient;全局配置和线程安全共享数据适合 Singleton
    • 合理控制注册顺序与重复注册,后注册会覆盖同接口先前注册

以上三部分构成了 ASP.NET Core 最核心的启动、管道与依赖管理机制,建议结合自己项目中新建最小示例(Minimal API + Startup)来亲手调试体验每个阶段的执行流程和依赖注入效果。

相关推荐

如何为MySQL服务器和客户机启用SSL?

用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...

OpenVPN客户端配置_openvpn客户端配置文件解析

...

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的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...