隐藏页面特效

.netcore生命周期、消息管道

.NET Core 的初始化过程涉及多个步骤,这些步骤从应用程序的启动开始,一直到应用程序准备好处理请求。下面是一个简化的概述,描述了 .NET Core 应用程序(特别是 ASP.NET Core 应用程序)的初始化过程:

  1. 启动主机(Host):
    • .NET Core 应用程序通过 CreateHostBuilder 方法(在 Program.cs 文件中)来创建和配置主机。
    • 主机负责应用程序的生命周期管理,包括启动、运行和关闭应用程序。
    • 对于 ASP.NET Core 应用程序,这通常是一个 Web 主机(WebHost)。
  2. 配置主机:
    • 在 CreateHostBuilder 方法中,会调用 ConfigureWebHostDefaults 或类似的方法来配置主机的默认设置。
    • 可以通过 ConfigureAppConfiguration 方法来添加或覆盖配置源,如 appsettings.json 文件、环境变量等。
  3. 构建依赖注入容器:
    • 在主机构建过程中,会创建依赖注入(DI)容器。这是 ASP.NET Core 的核心特性之一,用于实现控制反转(IoC)。
    • 通过在 Startup 类中注册服务(在 ConfigureServices 方法中),可以将服务添加到 DI 容器中。
  4. 执行 Startup 类:
    • Startup 类是 ASP.NET Core 应用程序的关键部分,它包含配置应用程序请求处理管道所需的逻辑。
    • ConfigureServices 方法用于配置应用程序的服务,这些服务稍后将被注入到控制器或其他类中。
    • Configure 方法用于设置应用程序的请求处理管道,通过添加中间件来定义请求的处理流程。
  5. 中间件管道配置:
    • 在 Configure 方法中,通过调用 app.Use* 方法来添加中间件到请求处理管道。
    • 中间件按照添加的顺序执行,每个中间件都可以对请求进行处理,然后决定是否将请求传递给管道中的下一个中间件。
  6. 路由配置:
    • 对于 ASP.NET Core MVC 或 Razor Pages 应用程序,路由是中间件管道中的关键部分。
    • 通过在 Startup 类的 Configure 方法中调用 app.UseRouting 和 app.UseEndpoints 方法来配置路由。
    • 路由中间件负责将传入的 HTTP 请求映射到相应的控制器操作或页面。
  7. 启动应用程序:
    • 一旦主机和应用程序被配置好,应用程序就开始监听传入的请求。
    • 对于 Web 应用程序,这通常意味着启动一个 HTTP 服务器(如 Kestrel)来监听指定的端口。
  8. 处理请求:
    • 当请求到达时,它们会经过中间件管道,每个中间件都可以对请求进行处理或修改。
    • 最终,请求会到达相应的控制器操作或页面,并生成响应。
  9. 发送响应:
    • 控制器操作或页面生成响应后,它会通过中间件管道返回给客户端。
    • 中间件可以在响应返回给客户端之前对响应进行最后的处理或修改。

这个过程是一个高度简化的概述,实际的初始化过程可能涉及更多的细节和配置步骤。但是,上述步骤提供了对 .NET Core 应用程序初始化过程的基本理解。

 netcore初始化启动:CreateHostBuilder 创建web服务器、配置web服务器ip:post----->IOC容器注册服务---->配置消息管道(内置中间件(鉴权、路由、静态文件处理、跨域)、第三方中间件(swagger、限流)、自定义中间件(全局异常日志))------>启动web服务器

 如果消息管道配置了中间件A、中间件B,一个请求如何处理

request-->反向代理服务器(IIS、Nginx) 转发-->内置web服务器Kestrel-->消息管道处理( 中间件A处理逻辑 --> 中间件B处理逻辑 --->业务处理(过滤器、控制器、业务处理)--> 中间件B结束逻辑 --> 中间件A结束逻辑) -->-反向代理服务器(IIS、Nginx)-> response

 

public class MyMiddleware : IMiddleware { public async Task InvokeAsync(HttpContext context, RequestDelegate next) { Console.WriteLine("MyMiddleware_1,开始处理"); await next.Invoke(context); Console.WriteLine("MyMiddleware_1,结束"); } } public class MyMiddleware1 : IMiddleware { public async Task InvokeAsync(HttpContext context, RequestDelegate next) { Console.WriteLine("MyMiddleware_2,开始处理"); await next.Invoke(context); Console.WriteLine("MyMiddleware_2,结束"); } } public static class Middleware3AppBuilderExtensions { public static IApplicationBuilder UseMiddleware3(this IApplicationBuilder app) { return app.UseMiddleware<MyMiddleware3>(); } } public class MyMiddleware3 : IMiddleware { public async Task InvokeAsync(HttpContext context, RequestDelegate next) { Console.WriteLine("MyMiddleware_3,开始处理"); await next.Invoke(context); Console.WriteLine("MyMiddleware_3,结束"); } }
// Add services to the container. //注入服务 builder.Services.AddSingleton<MyMiddleware>(); builder.Services.AddSingleton<MyMiddleware1>(); builder.Services.AddSingleton<MyMiddleware3>(); // Configure the HTTP request pipeline. //自定义中间件 app.UseMiddleware<MyMiddleware>(); app.UseMiddleware<MyMiddleware1>(); app.UseMiddleware3();

 


__EOF__

本文作者DaiWK
本文链接https://www.cnblogs.com/daiwk/p/18111270.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   DaiWK  阅读(331)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示