.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();

.netcore生命周期、消息管道的更多相关文章

  1. activity 和 生命周期: 消息通信

    实际上关于activity大概流程已经了解了,在深入的话方向应该是ams的处理操作和界面创建和view绘制.这些话题之后再谈,activity是一个gui程序,其中离不开的就是消息通讯,也就是在消息循 ...

  2. MVC学习笔记---MVC生命周期及管道

    ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节. ①以IIS6.0为例 ...

  3. ASP.NET 生命周期及管道事件

    Client(发送报文:请求行+请求头+空行+请求体) <------ Http 协议 ------> Server,由 Http.sys 监听 Http 请求 -> WAS+Met ...

  4. 从Asp .net到Asp core (第一篇)《回顾Asp .net生命周期与管道机制》

    从2016年微软收购了Xamarin整合到Visual Studio里并将其开源到现在已有三年多时间,从.net core 1.0 到现在的2.2,以及即将问世的3.0,我们看到微软正在跨平台之路越走 ...

  5. ASP.NET MVC生命周期与管道模型

      先来熟悉下asp.net请求管道 1.当客户端发送http://localhost:80/home/index请求时 2.首先到达服务端的内核模块HTTP.SYS(它监听80端口),通过访问注册表 ...

  6. asp.net页面生命周期请求管道19个事件

    HttpContext: ecb→ HttpWorkerRequest→HttpContext HttpApplicationFactory.获取了HttpApplication实例之后. (1)Be ...

  7. ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)

    ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节. ①以IIS6.0为例 ...

  8. 【深入ASP.NET原理系列】--ASP.NET请求管道、应用程序生命周期、整体运行机制

    微软的程序设计和相应的IDE做的很棒,让人很快就能有生产力..NET上手容易,生产力很高,但对于一个不是那么勤奋的人,他很可能就不再进步了,没有想深入下去的动力,他不用去理解整个框架和环境是怎么执行的 ...

  9. ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12)

    在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6) ",体验了1-6关键环节,本篇继续. ⑦根据IsapiWorkerRequest对象,HttpRun ...

  10. ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)

    在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12) ",体验了7-12关键环节,本篇继续. ⒀当请求到达UrlRoutingModule的时候,Url ...

随机推荐

  1. python并发执行request请求

    在Python中,我们可以使用requests库来发送HTTP请求,并使用threading.multiprocessing.asyncio(配合aiohttp)或concurrent.futures ...

  2. 一些自托管(self hosted)服务的使用笔记

    opengrok oracle的opengrok是一个项目代码查找工具,自建索引,类似工具有source insight 官方已经提供好了docker镜像,傻瓜式安装.不过增加新的项目源码时需要手动更 ...

  3. AT_abc215F 题解

    考虑二分答案. 假设当前二分的答案为 \(k\),那么对于每个点,距离大于等于 \(k\) 的点构成了平面上 \(4\) 个子平面. 那么只需查询子平面中是否存在点即可,类似于窗口的星星,把问题转换成 ...

  4. 直接给一个数组项赋值,Vue 能检测到变化吗?

    由于 JavaScript 的限制,Vue 不能检测到以下数组的变动: 当你利用索引直接设置一个数组项时,例如: vm.items[indexOfItem] = newValue 当你修改数组的长度时 ...

  5. javascript深入参数传递

    我们都知道javascript的基础数据类型有: Undefined . Null . Boolean . Number . String . 如果从一个变量向另一个变量复制基本类型的值,会在变量对象 ...

  6. adorner 使用示例

    模块介绍 adorner 是一个现代轻量级的 Python 装饰器辅助模块. 目前该模块仅实现了 4 个类,对应着 4 个功能:制造装饰器.执行计时.函数缓存.捕获重试. 仓库地址:https://g ...

  7. 数学工具 | 如何将图片公式快速输入到Word中?

    背景: 在日常科研.学习与工作中,我们可能需要使用到某些书籍.期刊或者规范上的公式,但是如果自己纯手打则会相当麻烦(数学系LaTeX高手请忽略),因此如果有工具能够解决这个问题,那真的是解决了一大痛点 ...

  8. canvas绘制飞线效果

    在我们做的可视化大屏项目中,经常会遇到飞线的效果. 在我们的大屏编辑器中,可以通过拖拽+配置参数的方式很快就能够实现.下面是我们使用大屏编辑器实现的一个项目效果: 中间地图就有飞线的效果. 抛开编辑器 ...

  9. let 和 const 是 JavaScript 中用于声明变量的关键字

    let 和 const 是 JavaScript 中用于声明变量的关键字. let 关键字用于声明可变(可重新赋值)的变量.通过使用 let 关键字声明的变量可以在其作用域内被重新赋值.例如: let ...

  10. 基于微信小程序的校园维修管理系统-开题报告参考

    \n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 一.课题研究的目的和意义** 本研究开发基于微信小程序的物品维修系统,它不仅能实现专业的维 ...