详解 ASP.NET Core 运行时之模块化设计

开发 前端
ASP.NET Core 运行时,是指框架本身在运行时执行的部分,主要包括以下几个方面:HTTP 模块、中间件管道、路由匹配、请求处理、响应处理、视图引擎等。

整体上可以分为以下几个模块:

应用程序托管模块

应用程序托管模块是入口点,主要负责创建 Host、解析 ConfigureServices 和 Configure 方法,创建 Pipeline 等。Host 是应用程序的主机运行时环境,它提供了一些配置和管理应用程序的基础功能,例如配置文件的读取、依赖注入容器的初始化、中间件的注册和加载等。ConfigureServices 方法主要用于注册依赖注入服务;Configure 方法则用于配置中间件管道,在这里注册各种 Middleware 和 Endpoint。

HTTP 模块

HTTP 模块是 ASP.NET Core 的核心模块,它负责处理 HTTP 请求并生成 HTTP 响应。该模块由以下三个子模块组成:HttpContext、HttpRequest、HttpResponse。

  1. HttpContext:表示每个 HTTP 请求的上下文。其中包含了请求对象(HttpRequest)、响应对象(HttpResponse)、路由信息、HTTP 版本以及一些自定义数据等。
  2. HttpRequest:表示一个 HTTP 请求。其中包括了请求头、Cookie、查询字符串、Form 表单数据、请求正文等信息。
  3. HttpResponse:表示一个 HTTP 响应。其中包括了状态码、响应头、Cookie、响应正文等信息。

中间件管道

中间件管道是 ASP.NET Core 处理请求的核心部分,它通过链式调用各种中间件来实现 HTTP 请求处理。每个 Middleware 可以选择把请求传递给下一个 Middleware 或者终止请求。中间件的注册和执行通过 IApplicationBuilder 接口进行控制。管道的执行流程是从第一个中间件开始执行,如果当前中间件没有终止请求,则使用 Next() 方法将请求传递给下一个中间件,直到所有的中间件都执行完毕并返回响应结果。

路由模块

路由模块负责 URL 路由和 Endpoint 的匹配工作。在路由模块中,ASP.NET Core 提供了丰富的路由模板语法,用于构建 RESTful Web API 和 MVC 应用程序。路由模块通常涉及到以下几个类:Route、RouteTemplate、RouteData、RouteContext。

 ActionInvoker 模块

ActionInvoker 模块是 MVC/Web API 中用于调用 Controller Action 方法的核心模块。该模块根据路由匹配的结果获取对应的 ActionDescriptor,然后通过反射调用 Controller 对应的 Action 方法,并自动将参数绑定到 Controller Action 方法中。

视图引擎模块

视图引擎模块用于 MVC 中的视图渲染工作,它的主要职责是根据 Controller Action 指定的视图名称和模型数据,渲染出对应的 HTML 内容。视图引擎分为两种:Razor 视图引擎和自定义视图引擎。

在 ASP.NET Core 的源码设计中,框架采用了面向对象编程的思想,利用接口、抽象类等方式实现模块之间的松耦合关系,方便扩展和替换。设计中也使用了依赖注入、工厂等设计模式来进行对象管理和创建。总体上,ASP.NET Core 的源码设计非常精巧,充分体现了 .NET 生态系统的优秀品质。

以下是一个 ASP.NET Core 运行时的示例代码,以说明运行时如何工作:

using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;

namespace MyNamespace
{
    public class Startup
    {
        // Configure services for DI container
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }

        // Configure HTTP request pipeline
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
                endpoints.MapControllers();
            });
        }
    }
}

在上述示例中,Startup 类是应用程序托管模块。ConfigureServices 方法用于注册依赖注入服务,这里使用 AddControllers() 方法来添加 MVC 控制器。Configure 方法则负责配置中间件管道,首先判断当前是否在开发环境中,如果是,则调用 UseDeveloperExceptionPage() 中间件来为开发者提供异常信息的友好显示;接着使用 UseRouting() 方法启用 Routing,接下来使用 UseEndpoints() 方法来配置请求终结点,其中 MapGet() 方法配置了一个 GET 请求终结点“/”,返回“Hello World!”;MapControllers() 方法则将所有控制器动作方法映射到当前应用程序。

官方文档:https://learn.microsoft.com/en-us/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-7.0。

责任编辑:姜华 来源: 今日头条
相关推荐

2023-07-03 08:48:40

Web模块化设计

2023-07-04 08:26:15

2009-07-20 16:14:39

ASP.NET运行时

2024-09-09 07:37:51

AspJWT权限

2009-11-27 14:17:45

ASP.NET 4运行

2009-08-10 13:32:15

ASP.NET TimASP.NET组件设计

2009-08-10 14:31:46

ASP.NET组件设计ASP.NET控件生命

2021-03-04 11:10:29

容器化Docker虚拟机

2009-07-28 17:17:19

ASP.NET概述

2017-03-06 11:13:57

ASP.NETCoreMVC

2024-10-21 07:15:08

2009-07-29 16:08:07

ASP和ASP.NET

2009-04-23 10:33:52

ASP.NET设计思想微软

2009-08-10 14:08:15

ASP.NET服务器控ASP.NET组件设计

2021-01-05 07:51:06

版本化ASP

2009-07-28 16:57:50

ASP.NET Ses

2009-08-05 11:14:33

ASP.NET ISA

2009-07-24 10:14:22

ASP.NET开发

2009-07-22 16:25:41

ASP.NET AJA

2009-07-23 13:19:51

点赞
收藏

51CTO技术栈公众号