zoukankan      html  css  js  c++  java
  • 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)。
  • 相关阅读:
    使用JDBC连接MySql时出现:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration
    Mysql Lost connection to MySQL server at ‘reading initial communication packet', system error: 0
    mysql-基本命令
    C# 监听值的变化
    DataGrid样式
    C# 获取当前日期时间
    C# 中生成随机数
    递归和迭代
    PHP 时间转几分几秒
    PHP 根据整数ID,生成唯一字符串
  • 原文地址:https://www.cnblogs.com/qtiger/p/12976207.html
Copyright © 2011-2022 走看看