ASP.NET Core项目解读之常用概念方法

环境:ASP.NET Core3.1

ASP.NET Core是一个全新的Web开发平台,微软在它上面构建了MVC、SingalR、GRPC、Orleans这样广泛使用的Web框架,我们先以MVC框架为例介绍利用ASP.NET Core构建项目的常见名词。

ASP.NET  Core MVC项目文件夹解读

一、什么是泛型主机?

  主机是封装应用资源的对象,例如 :依赖关系注入 (DI)、Logging、Configuration、IHostedService 实现。启动主机时,它对它在 DI 容器中找到的 IHostedService 的每个实现调用 IHostedService.StartAsync。 在 web 应用中,其中一个 IHostedService 实现是启动 HTTP 服务器实现的 web 服务。一个对象中包含所有应用的相互依赖资源的主要原因是生存期管理:控制应用启动和正常关闭。

二、泛型主机的创建、配置  

  1、主机通常由 Program 类中的代码配置、生成和运行,Program.cs是ASP.NET Core的启动入口文件。 Main 方法可以拆成以下代码:

IHostBuilder hostBuilder = CreateHostBuilder(args);//产生一个IHostBuilder实例hostBuilder ,创建通用主机
IHost host= hostBuilder.Build(); //运行给定操作以初始化主机。 这只能调用一次
host.Run();//运行应用程序并阻止调用线程,直至主机关闭。

   

  2、CreateHostBuilder在创建泛型主机的时候进行了什么样的配置呢?

  (1)CreateDefaultBuilder 方法的默认做的操作如下:

    •   将内容根目录设置为由 GetCurrentDirectory 返回的路径
    •   通过以下项加载主机配置:
      • 前缀为 DOTNET_ 的环境变量
      • 命令行参数
    •   通过以下对象加载应用配置:
      • appsettings.json
      • appsettings.{Environment}.json
      • 密钥管理器 当应用在 Development 环境中运行时
      • 环境变量。
      • 命令行参数。
    •   添加以下日志记录提供程序:
      • 控制台
      • 调试
      • EventSource
      • EventLog(仅当在 Windows 上运行时)
    •   当环境为“开发”时,启用范围验证依赖关系验证

  (2)ConfigureWebHostDefaults 方法的默认做的操作如下:  

    •   从前缀为 ASPNETCORE_ 的环境变量加载主机配置。
    •   使用应用的托管配置提供程序将 Kestrel 服务器设置为 web 服务器并对其进行配置。 有关 Kestrel 服务器默认选项,请参阅 ASP.NET Core 中的 Kestrel Web 服务器实现
    •   添加主机筛选中间件默认情况下,主机筛选中间件处于禁用状态。 要启用该中间件,请在 appsettings.json/appsettings.<EnvironmentName>.json 中定义一个 AllowedHosts 键 。 此值是以分号分隔的不带端口号的主机名列表。
    •   如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED 等于 true,则添加转接头中间件
    •   支持 IIS 集成。 有关 IIS 默认选项,请参阅 使用 IIS 在 Windows 上托管 ASP.NET Core

二、Program.cs概要

  ASP.NET Core应用程序需要在主机中执行,一个主机必须实现 IHost接口。主机通常使用 HostBuilder的实例来创建,该实例构建并返回一个 Host实例。 Host引用一个将用于处理请求的服务器Kestrel。主机负责应用程序启动和生命周期的管理。服务器Kestrel负责接受HTTP请求。主机的部分职责还包括确保应用程序服务和服务器Kestrel可用并正确配置。

    public static void Main(string[] args)
        {
            IHostBuilder hostBuilder = CreateHostBuilder(args);
            IHost host = hostBuilder.Build();//创建主机
            host.Run();
            //CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

三、IHostBuilder

   HostBuilder 用来构建 Host ,也是我们最先接触的一个类,它提供了如下方法:

  1、ConfigureAppConfiguration  

    通过对 IHostBuilder 调用 ConfigureAppConfiguration 为生成过程和应用程序的其余部分设置配置, 可多次进行调用,并累加结果 。由 ConfigureAppConfiguration 创建的配置可以通过 HostBuilderContext.Configuration 获取以用于后续操作,也可以通过 DI 作为服务获取, 主机配置也会添加到应用配置。 

    public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }).ConfigureAppConfiguration((h, c) =>//指定应用的配置提供程序
                {
                    c.AddJsonFile($"PersonConfig.Development.json", true, true);
                });

   2、ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)

   该方法是用来注入服务,我们关注点是参数HostBuilderContext,包含 IHost 上的公共服务的上下文。我们可以通过该参数获取应用程序中的配置信息等。

  比如我们的配置信息是在appsettings.json中。

四、Startup.cs

  ConfigureServices 用于配置依赖注入以在运行时根据依赖关系创建对象,Configure 用于配置中间件(middleware)以构建请求处理流水线。

  1、Configure

  在ASP.NET Core 应用程序中Configure方法用于指定中间件以什么样的形式响应HTTP请求。 Configure 方法是用来配置请求管道的,通常会在这里会注册一些中间件

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();//添加中间件,允许应用程序提供静态资源。
            //请求可以通过如下配置静态文件中间件来访问自定义的静态资源:
            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "ProjectStaticFile")),
                RequestPath = "/StaticFiles"
            });

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }

  

  2、ConfigureServices

  ConfigureServices方法是应用程序运行时将服务添加到容器中

    // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();//将控制器的服务添加到指定的IServiceCollection此方法将不会注册用于页面的服务。
       // IOPtions 方式读取自定义的配置,可参考之前梳理的知识 PersonOptions option
= new PersonOptions(); Configuration.GetSection("PersonOptions").Bind(option); services.AddSingleton(option); }

五、处理管道(中间件)   

  1、中间件是一种装配到应用管道以处理请求和响应的软件。

     2、管道就是多个中间件构成,当接收到一个请求时,请求会交给管道进行处理,请求从一个中间件的一端进入,从中间件的另一端出来,每个中间件都可以对HttpContext请求开始和结束进行处理。

  3、请求管道中的每个中间件负责调用管道中的下一个中间件,或使管道短路。 当中间件短路时,它被称为“终端中间件” ,因为它阻止中间件进一步处理请求。  

  4、ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。

 

  (1)每个委托均可在下一个委托前后执行操作。 应尽早在管道中调用异常处理委托,这样它们就能捕获在管道的后期阶段发生的异常。

  (2)ASP.NET Core 应用设置了处理所有请求的单个请求委托。 这种情况不包括实际请求管道, 调用单个匿名函数以响应每个 HTTP 请求。

  5、以下 Startup.Configure 方法将为常见应用方案添加中间件组件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    // app.UseCookiePolicy();

    app.UseRouting();
    // app.UseRequestLocalization();
    // app.UseCors();

    app.UseAuthentication();
    app.UseAuthorization();
    // app.UseSession();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}
    • 异常/错误处理
      • 当应用在开发环境中运行时:
        • 开发人员异常页中间件 (UseDeveloperExceptionPage) 报告应用运行时错误。
        • 数据库错误页中间件报告数据库运行时错误。
      • 当应用在生产环境中运行时:
        • 异常处理程序中间件 (UseExceptionHandler) 捕获以下中间件中引发的异常。
        • HTTP 严格传输安全协议 (HSTS) 中间件 (UseHsts) 添加 Strict-Transport-Security 标头。
    • HTTPS 重定向中间件 (UseHttpsRedirection) 将 HTTP 请求重定向到 HTTPS。
    • 静态文件中间件 (UseStaticFiles) 返回静态文件,并简化进一步请求处理。
    • Cookie 策略中间件 (UseCookiePolicy) 使应用符合欧盟一般数据保护条例 (GDPR) 规定。
    • 用于路由请求的路由中间件 (UseRouting)。
    • 身份验证中间件 (UseAuthentication) 尝试对用户进行身份验证,然后才会允许用户访问安全资源。
    • 用于授权用户访问安全资源的授权中间件 (UseAuthorization)。
    • 会话中间件 (UseSession) 建立和维护会话状态。 如果应用使用会话状态,请在 Cookie 策略中间件之后和 MVC 中间件之前调用会话中间件。
    • 用于将 Razor Pages 终结点添加到请求管道的终结点路由中间件(带有 MapRazorPages 的 UseEndpoints)。
原文地址:https://www.cnblogs.com/qtiger/p/12976207.html